mixin是一个类,其方法被添加到另一个类或与另一个类混合。
基类包含来自mixin的方法,而不是从mixin继承。这允许您通过向基类添加不同的mixin来添加或增强基类的行为。
本小节包含有关如何使用JavaScript混合来覆盖Magento中的组件方法的信息。
*****
**Mixin作用域**
模块mixin的作用域取决于其在视图目录下的目录位置。
这允许您以Magento中特定区域的组件实例为目标。
下表将目录位置映射到mixin影响的应用程序区域:
<table style="table-layout:auto">
<thead>
<tr>
<th>Directory</th>
<th>Scope</th>
</tr>
</thead>
<tbody>
<tr>
<td><code class="language-plaintext highlighter-rouge">view/frontend</code></td>
<td>Storefront</td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">view/adminhtml</code></td>
<td>Admin panel</td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">view/base</code></td>
<td>All areas (unless a specific <code class="language-plaintext highlighter-rouge">frontend</code> or <code class="language-plaintext highlighter-rouge">adminhtml</code> entry exists)</td>
</tr>
</tbody>
</table>
*****
**Mixin files**
mixin是位于特定于区域的目录下的web/js目录下的JavaScript文件。mixin文件可以嵌套在更多的目录下,只要这些目录在web/js下。
*****
**Mixin格式**
Magento中的mixin被编写为返回回调函数的AMD模块。此函数接受目标组件(模块)作为参数,并返回模块。
这允许您在应用程序中使用目标组件之前,返回目标组件的新实例及其附加的修改。
*****
### **示例:**
扩展UI组件
下面是一个mixin示例,它使用一个函数扩展目标组件,该函数向列元素引入新的blockVisibility属性。
`File:ExampleCorp/Sample/view/base/web/js/columns-mixin.js`
```
define(function () {
'use strict';
var mixin = {
/**
*
* @param {Column} elem
*/
isDisabled: function (elem) {
return elem.blockVisibility || this._super();
}
};
return function (target) { // target == Result that Magento_Ui/.../columns returns.
return target.extend(mixin); // new result that all other modules receive
};
});
```
*****
扩展jQuery小部件
下面是一个mixin示例,它使用一个函数扩展了模态小部件,该函数添加了对模态关闭的确认。
`File: ExampleCorp/Sample/view/base/web/js/modal-widget-mixin.js`
```
define(['jquery'], function ($) {
'use strict';
var modalWidgetMixin = {
options: {
confirmMessage: "Please, confirm modal closing."
},
/**
* Added confirming for modal closing
*
* @returns {Element}
*/
closeModal: function () {
if (!confirm(this.options.confirmMessage)) {
return this.element;
}
return this._super();
}
};
return function (targetWidget) {
// Example how to extend a widget by mixin object
$.widget('mage.modal', targetWidget, modalWidgetMixin); // the widget alias should be like for the target widget
return $.mage.modal; // the widget by parent alias should be returned
};
});
```
扩展JS对象
JS mixin的另一个用例是当基本Javascript文件返回一个对象时。在这种情况下,需要一个包装器。下面的示例MIXIN扩展了StaveNavigor对象的SthHASE方法。这里,this.\\u super()是基本方法,如果需要,可以调用它。
`File: ExampleCorp/Sample/view/frontend/web/js/model/step-navigator-mixin.js`
```
define([
'mage/utils/wrapper'
], function (wrapper) {
'use strict';
return function (stepNavigator) {
stepNavigator.setHash = wrapper.wrapSuper(stepNavigator.setHash, function (hash) {
this._super(hash);
// add extended functionality here or modify method logic altogether
});
return stepNavigator;
};
});
```
扩展JS函数
下面是一个mixin示例,它向“处理结算”功能添加了其他功能。
`File: ExampleCorp/Sample/view/frontend/web/js/proceed-to-checkout-mixin.js`
```
define([
'mage/utils/wrapper'
], function (wrapper) {
'use strict';
return function (proceedToCheckoutFunction) {
return wrapper.wrap(proceedToCheckoutFunction, function (originalProceedToCheckoutFunction, config, element) {
originalProceedToCheckoutFunction(config, element);
// add extended functionality here
});
};
});
```
声明mixins
mixin在requirejs-config.js配置文件的Mixins属性中声明。此文件必须在定义mixin的同一特定于区域的目录中创建。
requirejs-config.js中的mixin配置使用目标组件的路径将其与mixin关联。
实例
以下是requirejs-config.js文件的示例,该文件将前面示例中定义的columns-mixin、modal-widget-mixin、tep-navigator-mixin和proceed-to-checkout-mixin混合添加到grid column component, modal widget, step navigator object, and proceed to checkout function
`File: ExampleCorp/Sample/view/base/requirejs-config.js`
```
var config = {
config: {
mixins: {
'Magento_Ui/js/grid/controls/columns': {
'ExampleCorp_Sample/js/columns-mixin': true
},
'Magento_Ui/js/modal/modal': {
'ExampleCorp_Sample/js/modal-widget-mixin': true
},
'Magento_Checkout/js/model/step-navigator': {
'ExampleCorp_Sample/js/model/step-navigator-mixin': true
},
'Magento_Checkout/js/proceed-to-checkout': {
'ExampleCorp_Sample/js/proceed-to-checkout-mixin': true
}
}
}
};
```
在Magento中mxins示例
以下是Magento\_CheckoutAgreement模块中声明和定义修改签出行为的混合的文件列表:
```
view/frontend/requirejs-config.js
view/frontend/web/js/model/place-order-mixin.js
view/frontend/web/js/model/set-payment-information-mixin.js
```
- Magento概述
- 第一章:路线图
- 概述
- 前端技能
- 后端技能
- 第二章:Linux环境
- 1.安装虚拟机VirtualBox
- 2.创建虚拟机
- 3.安装Ubuntu系统
- Linux文件系统概述
- Linux常用操作命令
- 第三章:Docker专题
- Docker概述
- 1.基础
- 2.镜像
- 3.容器
- 4.容器互联
- 5.dockerfile
- 6.docker-compose
- 7.docker安装nginx
- 8.docker安装mysql
- 9.docker安装redis
- 10.docker安装php
- 11.docker配置nginx-php-mysql
- 12.docker-compose构建lamp
- 13.附录
- 第四章:LAMP环境
- Docker构建LAMP开发环境
- 一键安装LNMP/LAMP
- 第五章:Magento安装
- Magento环境要求
- Docker安装Magento
- 填充网站首页、分类、商品等
- 第六章:Linux开发模式
- 编辑器vscode及插件
- 开发模式之SSH
- 开发模式之SFTP
- 开发模式之git
- 第七章:Magento架构
- 架构概述
- 文件目录结构
- 数据库表解析之EAV
- Magento命令行
- 第八章:模块结构解析
- 模块目录结构
- 配置文件之env.php
- 配置文件-routes.xml
- 配置文件之module.xml
- 配置文件之webapi.xml
- 配置的方式及加载顺序
- mvc之controller
- mvc之model
- mvc之block
- mvc之模板
- api概述
- 第九章:自定义模块
- 自定义模块概述
- 建立模块
- 注册模块
- 创建控制器
- 创建Block
- 创建模板
- Model-Collection-ResourceModel
- 添加后台菜单
- 第十章:重写(Override)
- 重写概述
- 布局文件详解
- 定位布局文件
- 重写Controller
- 重写Template
- 重写Block
- 重写Model
- 重写其它类
- 第十一章:小部件(Widget)
- 1.Widget概述
- 2.Widget在CMS页面的应用
- 3.自定义一个Widget
- 4.Widget添加到前台页面
- 第十二章:主题(Theme)
- 主题概述
- 1.创建新的主题
- 2.添加全局css文件
- 3.模板分离到主题
- 4.主题模板与javascript
- 5.magento封装的js写法
- 6.layout布局解析
- 7.创建移动端主题
- 第十三章:Template专题
- 模板的指定
- 自定义模板
- 模板重写的规则
- 第十四章:Javascript专题
- magento中的javascript
- requirejs语法
- js的调用和初始化
- js的重写和扩展
- javascript使用mixins
- 第十五章:Knockoutjs专题
- knockoutjs的应用
- knockout简介
- Observables
- Observable Arrays
- Computed Observables
- Bindings(绑定)
- Visible和hidden绑定
- Text绑定
- html绑定
- class和css绑定
- style绑定
- attr绑定
- 表单-click绑定
- 表单-submit绑定
- 表单-value值绑定
- 表单-textInput绑定
- 表单-checked绑定
- 表单-options绑定
- data-bind语法
- binding上下文
- 第十六章:Checkout专题
- 结算页面概述
- 添加新的结帐步骤
- 添加自定义支付方式
- 结算前添加自定义验证
- 添加自定义配送方式
- 添加自定义配送验证
- 为邮政编码添加掩码
- 为字段添加自定义模板
- 结账页面添加新的input
- 在地址表单中添加字段
- 添加自定义配送地址
- 结算页面其它字段修改
- 自定义运输方式列表
- 线下支付方式添加字段
- 第十七章:实战案例解析
- 从零开发一个模块
- 1.需求分析
- 2.数据表与数据填充
- 3.建立module
- 4.路由
- 5.控制器
- 6.创建Block
- 7.创建布局
- 8.建立模板
- 9.建立Model层
- 10.查询数据
- 11.完善模板
- 12.小结
- 定制我的订单页面
- 1.需求分析
- 2.新建模块
- 3.重写:布局文件
- 4.Block文件
- 5.模板文件
- 6.添加css文件
- 7.测试定制结果
- 添加系统配置模块
- 1.需求分析
- 2.后台实现
- 3.前台实现
- 第三方登录到magento
- 1.需求分析
- 2.登录页表单
- 3.建立module
- 4.建立控制器-后端登录逻辑
- 5.建立控制器-登录中间页
- 6.建立中间页的layout文件
- 7.建立block文件
- 8.建立登录中间页模板
- 9.第三方登录扩展
- 保留心愿单商品
- 1.需求分析
- 2.Plugin机制-拦截器
- 3.心愿单修改示例
- 创建订单流程及扩展
- 1.需求分析
- 2.创建订单流程追踪
- 3.重写
- 用户注册添加字段
- 1-需求分析
- 2-功能实现
- 第十八章:RestApi专题
- webapi概述
- 如何访问一个api
- swagger介绍
- 将services配置为webapi
- 配置api示例
- 设置自定义路由
- 第十九章:设计模式专题
- 设计模式概述
- 创建型模式
- 工厂方法
- 抽象工厂
- 生成器
- 原型
- 单例
- 结构型模式
- 适配器
- 桥接
- 组合
- 装饰
- 外观
- 享元
- 代理
- 行为模式
- 责任链
- 命令
- 迭代器
- 中介者
- 备忘录
- 观察者
- 状态
- 策略
- 模板方法
- 访问者
- 第二十章:性能最佳实践
- 本章概述
- 硬件推荐
- 软件推荐
- 架构参考
- 开发环境建议
- 配置最佳实践
- 部署流程
- 高级设置
- 附录1:常用代码及问题整理
- 权限报错问题
- Magento定时任务
- Magento开发基础篇一
- Magento开发基础篇二
- Magento之CRUD
- Magento中获取各种url的方法
- Redis存储Session和缓存
- 发送邮件配置
- 检测用户登录信息
- 获取env.php中配置的变量
- 模板中获取当前页面url
- 获取用户默认配送地址
- Magento系统问题整理
- 结算页面不能选择账单地址
- 我应该执行什么命令?
- 追代码打印sql
- 忘记后台密码怎么办?
- 附录2:多语言应用
- 多语言概述
- 日语翻译引擎
- 附录3:插件安装与GMO
- 安装插件的方法
- GMO支付插件
- 附录4:Elasticsearch搜索和分词
- ElasticSearcch配置与安装
- ES实现搜索日语分词