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實現搜索日語分詞