根据对KnockoutJS文档的粗略阅读,初始化一个非常基本的Knockout视图如下所示
// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI
function AppViewModel() {
this.firstName = "Bert";
this.lastName = "Bertington";
}
// Activates knockout.js
ko.applyBindings(new AppViewModel());
即-您创建一个旨在用作对象构造函数的javascript函数,实例化该对象,然后将该对象传递到ko.applyBindings
全局剔除对象(ko
)的方法中
但是,在Magento 2中,如果您使用Grid UI加载后端页面,则Magento将初始化js/core/app.js
RequireJS模块
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'./renderer/types',
'./renderer/layout',
'Magento_Ui/js/lib/ko/initialize'
], function (types, layout) {
'use strict';
return function (data) {
types.set(data.types);
layout(data.components);
};
});
该模块反过来加载该Magento_Ui/js/lib/ko/initialize
模块,该模块似乎初始化了Magento对KnockoutJS的使用。但是,如果您查看初始化模块的来源。
define([
'ko',
'./template/engine',
'knockoutjs/knockout-repeat',
'knockoutjs/knockout-fast-foreach',
'knockoutjs/knockout-es5',
'./bind/scope',
'./bind/staticChecked',
'./bind/datepicker',
'./bind/outer_click',
'./bind/keyboard',
'./bind/optgroup',
'./bind/fadeVisible',
'./bind/mage-init',
'./bind/after-render',
'./bind/i18n',
'./bind/collapsible',
'./bind/autoselect',
'./extender/observable_array',
'./extender/bound-nodes'
], function (ko, templateEngine) {
'use strict';
ko.setTemplateEngine(templateEngine);
ko.applyBindings();
});
你看Magento的所谓的ko.applyBindings();
对象,而不视图对象。这没有任何意义,我不确定这是否是我对淘汰赛的有限了解,还是Magento在这里做自定义/奇怪的事情。
这是Magento实际应用Knockout绑定的地方吗?还是发生在其他地方?还是Magento做一些棘手的事情来拦截Knockout代码并在其他地方处理它?