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. gdb 常用选项

    gdb 常用选项 help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r st ...

  2. 【剑指Offer】面试题10- I. 斐波那契数列

    题目 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0,   F(1) = 1 F(N) = F(N - 1) + F(N - 2) ...

  3. 【剑指Offer】面试题10- II. 青蛙跳台阶问题

    题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返 ...

  4. SpringAOP切入点的表达式

    1. 常用的切入点表达式分为:  (1)按类型匹配:within 关键字 (2)按函数匹配:execution (3)按bean的id匹配:bean 2.按类匹配的写法 匹配到具体的类:<aop ...

  5. cf 760B.Frodo and pillows

    二分,判断条件就是最小情况(设当前k位取x)比剩余值(m-x)要小.(貌似又做麻烦了2333) #include<bits/stdc++.h> #define LL long long # ...

  6. Charles中windows版本解决response乱码问题

    实际上三种,目前写了两种,加了之后有的不显示乱码,但是有的还是显示,第三种搜索结果是安装证书,但是本人安装后证书后未受到信任,所以暂时不知是否能够成功 1,在charles.ini中,手动增加一个vm ...

  7. react-native-tab-view 导航栏切换插件讲解

    首先引入插件 yarn add react-native-tab-view 如果用的原生环境要安装另外几个插件 yarn add react-native-reanimated react-nativ ...

  8. [WesternCTF2018]shrine

    0x00 知识点 SSTI模板注入: 模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程 服务端把用户输入的内容渲染成模板就可能造成SSTI(Server-Side Template In ...

  9. Java多线程通讯---------wait,notify区别

    class Res{ public String username; public String sex; } class Out extends Thread{ Res res; public Ou ...

  10. xv6 系统调用

    1. 系统调用的实现 开发程序需所有的接口在user.h中,包含两部分system call和ulib user.h中的系统接口函数在usys.S中通过汇编实现 #define SYSCALL(nam ...