mixin 是一个类,该类的方法被添加,混合进另外一个类。
一个基础类会包含mixin类的方法而不是继承它。这样你就可以使用不同的mixin类来增加或者增强基础类的功能。

这编内容包含怎么样使用javascript mixin来重写Magento组件的方法。

Mixin Scope
一个模块的作用域(scope)取决于其在view目录下的目录位置。这样你就可以定位magento特定位置的特定组件实例。

下表对minxin应用区域和其目录位置做了映射。

Directory Scope
view/frontend Storefront
view/adminhtml Admin panel
view/base All areas (unless a specific frontend or adminhtml entry exists)

Mixin文件
位置
Minxins是在特定区域目录web/js目录下的javascript文件。只要mixin文件在web/js目录下,它可被嵌套到多个目录。
格式
Magento内的mixin被写成一个返回回调方法的AMD模块。这个方法接收目标组件(模块)作为参数同时会返回一个模块。
举例:
扩展UI组件(component)
以下是minxin通过引入新的blockvisibility属性到一个列元素来扩展目标组件的一个示例。

File: OrangeCompany/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 Widget
下面是一个mixin的示例,该mixin扩展了模态窗口小部件,并添加了模态关闭确认的功能。
文件:OrangeCompany/Sample/view/base/web/js/modal-widget-mixin.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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对象
另一个mixin的使用使用场景是当基础javascript文件返回一个对象。这种情况下,包装是必要的。以下mixin示例扩展step navigatior setHash方法。这里的this._super()是可以被调用的基础方法。

File: OrangeCompany/Sample/view/frontend/web/js/model/step-navigator-mixin.js 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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为proceed to checkout 方法添加额外方法的示例。

1
2
3
4
5
6
7
8
9
10
11
12
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
});
};
});

声明一个mixin
Mixins是在requirejs-config.js配置文件的mixins属性里声明的。这个文件必须在该mixins属性指定的位置创建。
requirejs-config.js里的mixins配置会把目标组件和mixin通过路径相关联。

示例:

以下是一个requirejs-config.js文件的示例,该示例把上面定义的 columns-mixinmodal-widget-mixinstep-navigator-mixin, and proceed-to-checkout-mixin mixins添加到 grid column component, modal widget, step navigator object, and proceed to checkout function.
文件:
OrangeCompany/Sample/view/base/requirejs-config.js

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var config = {
config: {
mixins: {
'Magento_Ui/js/grid/controls/columns': {
'OrangeCompany_Sample/js/columns-mixin': true
},
"Magento_Ui/js/modal/modal": {
"OrangeCompany_Sample/js/modal-widget-mixin": true
},
'Magento_Checkout/js/model/step-navigator': {
'OrangeCompany_Sample/js/model/step-navigator-mixin': true
},
'Magento_Checkout/js/proceed-to-checkout': {
'OrangeCompany_Sample/js/proceed-to-checkout-mixin': true
}
}
}
};

Magento中Mixin示例
以下是Magento_CheckoutAgreement模块为修改结账行为,声明和定义mixin的文件列表。

  • view/frontend/requirejs-config.js
  • view/frontend/web/js/model/place-order-mixin.js
  • view/frontend/web/js/model/set-payment-information-mixin.js

来源:赣州网站优化

JavaScript mixins的更多相关文章

  1. javascript的Mixins

    mixin在javascript里可以看作是一种从别的对象"借用"功能的方法.每一个新定义的对象都有一个 prototype属性,其他的对象就可以从这里"借用" ...

  2. JavaScript Patterns 6.6 Mix-ins

    Loop through arguments and copy every property of every object passed to the function. And the resul ...

  3. JavaScript面向对象之我见

    序言 在JavaScript的大世界里讨论面向对象,都要提到两点:1.JavaScript是一门基于原型的面向对象语言 2.模拟类语言的面向对象方式.对于为什么要模拟类语言的面向对象,我个人认为:某些 ...

  4. ES6新特性:使用新方法定义javascript的Class

    ES6中定义类的方式, 就是ES3和ES5中定义类的语法糖,虽然也有些区别,但是整体定义类的方式更加简洁,类的继承更加方便, 如果想对ES6中的继承更加熟悉, 最好了解ES5中原型继承的方式, 博客园 ...

  5. TypeScript & JavaScript

    http://www.typescriptlang.org/docs/tutorial.html handbook: Basic Types Variable Declarations Interfa ...

  6. a primary example for Functional programming in javascript

    background In pursuit of a real-world application, let’s say we need an e-commerce web applicationfo ...

  7. EXTJS4自学手册——EXT基本方法、属性(mixins多继承、statics、require)

    1.mixins 说明:类似于面向对象中的多继承 <script type="text/javascript"> Ext.onReady(function () {// ...

  8. Javascript.ReactNative-2-javascript-syntax-in-react-native

    JavaScript Syntax in React Native Contents: Arrow Function Let+Const Default + Rest + Spread Destruc ...

  9. 大型 JavaScript 应用架构中的模式

    原文:Patterns For Large-Scale JavaScript Application Architecture by @Addy Osmani 今天我们要讨论大型 JavaScript ...

随机推荐

  1. Swift 元组 Tuple

    let infoArray:[Any] = ["jack",18,1.88] let infoName=infoArray[0] as!String //此处为Any类型强转为St ...

  2. HDU_4912 Path on the tree 2014多校5 贪心+LCA

    当时刚学LCA-tarjan不久,就比赛有这个题,但没想到还是没做出来..一开始以为是DP来着,没想到是贪心,想想也对,从树的最下层开始,每次遇到询问的点,就找到他们的LCA(路径里面必经LCA),然 ...

  3. 最简单的前端获取后台的json值(后台怎么返回一个json对象到前台)

    (说一下这个外部包jackson一般不用了,现在大家都用马云儿子的FastJson 下面服务器代码我就不改了大家随意用什么外部包)2019.1.14日改 我使用了外部包jackson(杰克逊哈哈哈啊) ...

  4. Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  5. C# Stream篇(七) -- NetworkStream

    NetworkStream 目录: NetworkStream的作用 简单介绍下TCP/IP 协议和相关层次 简单说明下 TCP和UDP的区别 简单介绍下套接字(Socket)的概念 简单介绍下Tcp ...

  6. 百度地图API提供Geocoder类进行地址解析

    根据地址描述获得坐标百度地图API提供Geocoder类进行地址解析,您可以通过Geocoder.getPoint()方法来将一段地址描述转换为一个坐标. // 创建地址解析器实例var myGeo ...

  7. 在线答题APP动工前的小总结

    7月26号,确定了我们这个暑假的学习任务——做一个答题软件.目的就是为了让我们在做项目中学习,在学习中提高做项目的能力.但是,由于基础知识都还没掌握牢固,所以从本周三确定项目以来,基本没有一点进展. ...

  8. Essay写作关键:严谨的逻辑关系

    一篇好的文章并不是句子的机械堆砌,而是一个有机整体,句子和句子之间是存在严谨的逻辑关系的,要注意句子和句子之间,段落和段落之间的衔接和连贯(Coherence and Cohesion). 要写出逻辑 ...

  9. java笔记01

    java对象数组 Student[] Students = new Student[3]; 与普通数组无差 java集合类 集合类: 面向对象对事物的描述是通过对象来体现的. 为了方便对多个对象进行操 ...

  10. 初学C#之变量、占位符、转义符、还有就是类型转换

    ㈠.定义变量 先定义再赋值 int Num1; Num1 = ; 定义的同时赋值 ; 定义多个变量同时赋值,先决条件变量类型相同,例如: string phome = "1891250888 ...