创建jQuery UI Widget
requirejs-config.js
var config = {
map: {
'*': {
'widgetDemo': 'Vendor_Module/js/widgetDemo'
}
}
};
// <div data-mage-init='{"widgetDemo":{var1:1, var2:2}}'></div>
define([
'jquery',
'jquery/ui'
], function ($){
$.widget('mage.widgetDemo', {
options: {var1:0},
_create: function () {
// 生成HTML,绑定事件
},
_init: function () {
// 当前元素
this.element;
// 参数
this.options;
}
});
return $.mage.widgetDemo;
});
建议使用data-role给widget中各元素定位,例如widget需要把结果生成到指定的span元素内,那么结果容器元素可以这样写<span data-role="result"></span>
调用方法
<div data-mage-init='{"widgetDemo":{"var1":"1", "var2":"2"}}'></div>
或
<script type="text/x-magento-init">
{
"*": {
"widgetDemo": {"var1":"1", "var2":"2"}
}
}
</script>
Knockout 组件创建
[Inchoo_Js]/view/frontend/web/js/koexample.js
// <Inchoo_Js>/view/frontend/web/js/koexample.js
define(['ko', 'uiComponent'], function(ko, Component) {
return Component.extend({
defaults: {
firstname: 'william',
lastname: 'wen',
fullname: ''
},
initialize: function () {
var self = this;
this._super();
// 定义observe对象,与ko.observable()一样
this.observe([
'firstname',
'lastname'
]);
// ko以observe对象同步数据,ko.computed()把多个observe结果包装成一个observe,实现复杂的数据同步
this.fullname = ko.computed(function(){
return self.firstname()+' '+self.lastname();
});
console.log(this.param1);
},
getCount: function() {
var cart = customerData.get('cart');
return cart().summary_count;
}
});
});
(any).phtml
<div data-bind="scope: 'koexample'">
<!-- 直接在phtml里输出值 -->
<!-- ko text: firstname --><!-- /ko -->
<!-- ko text: lastname --><!-- /ko -->
<!-- ko text: fullname --><!-- /ko -->
<!-- ko text: getCount() --><!-- /ko -->
<!-- 调用模板 -->
<!-- ko template: getTemplate() --><!-- /ko -->
</div>
<script type="text/x-magento-init">
{
"*": {
"Magento_Ui/js/core/app": {
"components": {
"koexample": {
"component": "Inchoo_Js/js/koexample",//<Inchoo_Js>/view/frontend/web/template/example.html
"template" : "Inchoo_Js/example",
"param1" : "hello world!"
}
}
}
}
}
</script>
常用的Knockoutjs语法
<!-- ko i18n: 'Items in Cart' --><!-- /ko -->
<!-- ko text: getTotals() --><!-- /ko -->
<!-- ko if: getItemsQty() > 1 -->
<!-- /ko -->
<!-- ko foreach: getItems() -->
<li class="product-item">
<div class="product">
<!-- ko foreach: $parent.elems() -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
</div>
</li>
<!-- /ko -->
参考
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。