当前位置: 技术文章>> 扩展Magento2默认JS组件

文章标题:扩展Magento2默认JS组件
  • 文章分类: Magento
  • 13949 阅读
系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》

本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。


由于Magento 2已经推出很长一段时间了,并且基于该平台的新项目正在迅速接近,毫无疑问,作为开发人员,我们需要为挑战做好充分的准备。

在这篇文章中,我将演示如何处理平台的默认javascript组件(widget实例)。更准确地说,是负责网站主导航功能的javascript组件。如果您有兴趣,请继续阅读。

### 介绍

Magento 2中主导航的前端部分是用javascript逻辑构建的,负责从移动设备的转换到台式计算机的悬停延迟计时的众多操作。在大多数情况下,默认方法就足够了,并且基本上涵盖了所有需求,但有时,在项目需要特定/自定义方法的情况下,我们迟早会发现自己处于修改默认逻辑的情况。

让我们把自己放在一个位置,我们的项目需要对主导航javascript部分进行某些修改。首先,我们需要了解该过程涉及的一些基本文件架构和技术。

Magento 2使用Require JS(AMD或异步模块加载器和jQuery/jQuery UI库)作为创建系统上当前存在的javascript组件的基础。

我不会进一步介绍requireJS,但如果您需要了解更多信息,您可以查看我们涵盖此主题的博客文章。另外,我强烈建议访问requireJS网站,以便在使用Magento 2之前获得AMD的坚实基础知识并要求JS基本用法。

另一个重要的注意事项是,jQuery UI widget factory用于提供简单的可扩展技术,与Magento 1中的旧原型类方法非常相似。如果你不熟悉jQuery UI小部件,我强烈建议你访问学习jQuery网站,其中包含小部件工厂示例,以熟悉这个概念。

### 扩展默认值

负责导航菜单功能的主文件是menu.js位于[project_root]/lib/web/mage/下,以及其他默认的js系统组件。

现在,如果我们不想扩展或覆盖它,我们需要确保我们遵循以下步骤。

### 步骤 1

要使用我们的自定义内容正确扩展菜单.js部分,第一步是映射我们的 js 文件,以便系统加载它而不是默认文件。

Magento使用requirejs-config.js文件成功地映射系统上的js组件。首先重要的是知道在哪里放置requirejs-config.js。它可以放置在多个层次上。

所有requireJS配置将按以下顺序合并和执行:

模块级别

主题模块级别(父主题)

主题模块级别(当前主题)

主题级别(父主题)

主题级别(当前主题)

让我们用一个真实的例子看看它是如何工作的。默认文件是菜单.js我们希望将其替换为我们的自定义文件。请注意,之后我仍将加载默认菜单.js文件作为依赖项。

我们需要创建将替换菜单.js文件的文件。我们称之为menu-custom.js并将其放在[current_theme]/web/js/目录下。

### 步骤 2

接下来,我们需要创建requirejs-config.js文件并将其放在[current_theme]/root目录下。这样我们就可以成功映射我们的文件以替换默认文件。请参阅以下示例:

var config = {
    "map": {
        "*": {
            "menu": "js/menu-custom"
        }
 
    }
};

要真正确定该过程是否成功,请确保在加载新文件时签入开发人员工具。

### 步骤 3

现在是有趣的部分!我们不想扩展默认功能,这就是jQuery小部件工厂发挥作用的地方。我们将以下代码放入我们新创建的菜单自定义.js文件中。

检查以下示例:

define([
    'jquery',
    'jquery/ui',
    'mage/menu'],
    function($){
        $.widget('inchoo.menu', $.mage.menu, {
            _init: function () {
                alert("I'm Inchoo");
            },
            toggle: function () {
                alert("I'm Inchoo");
            }
    });
    return $.inchoo.menu;
    });


从上面的例子中我们可以看到,我们正在使用 require js 来定义我们的依赖项。第一个是jquery,第二个是jquery/ui,最后一个是mage/menu。

这意味着在这 3 个完全加载之前,我们的脚本不会加载,因为我们的逻辑依赖于它。

我们名为 inchoo.menu 的自定义小部件实例正在扩展默认的 $.mage.menu,在本例中,为了本教程,我将扩展两种方法,_init 和切换。切换方法负责切换智能手机和平板电脑上的导航_init而该方法负责组件初始化。

默认菜单中的原始切换方法示例.js

toggle: function () {
            if ($('html').hasClass('nav-open')) {
                $('html').removeClass('nav-open');
                setTimeout(function () {
                    $('html').removeClass('nav-before-open');
                }, 300);
            } else {
                $('html').addClass('nav-before-open');
                setTimeout(function () {
                    $('html').addClass('nav-open');
                }, 42);
            }
        },

### 覆盖文件

在某些情况下(尽管在相对罕见的情况下),您会发现自己可以完全覆盖菜单逻辑(创建自定义导航)。在这种特定情况下,我们可以应用步骤 1 和步骤 2,并在菜单自定义.js文件中创建自定义导航逻辑。

就是这样!我们已经成功地扩展了默认菜单.js小部件实例。该过程可以应用于系统上当前显示的任何小部件实例。


推荐文章