Theo một cách đọc rất khó hiểu về tài liệu KnockoutJS, việc khởi tạo một khung nhìn Knockout rất cơ bản trông giống như sau
// 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());
tức là - bạn tạo một hàm javascript dự định được sử dụng như một hàm tạo đối tượng, khởi tạo một đối tượng từ nó và sau đó chuyển đối tượng đó vào ko.applyBindings
phương thức của đối tượng loại bỏ toàn cục ( ko
)
Tuy nhiên, trong Magento 2, nếu bạn tải trang phụ trợ với Giao diện người dùng lưới, Magento sẽ khởi tạo js/core/app.js
mô-đun 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);
};
});
Đến lượt mình, Magento_Ui/js/lib/ko/initialize
mô-đun này tải mô-đun, xuất hiện để khởi tạo việc sử dụng KnockoutJS của Magento. Tuy nhiên, nếu bạn nhìn vào nguồn của mô-đun khởi tạo.
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();
});
Bạn thấy Magento được gọi là ko.applyBindings();
đối tượng mà không có đối tượng xem . Điều này không có ý nghĩa gì, và tôi không chắc liệu đó là sự hiểu biết hạn chế của tôi về Knockout hay Magento đang làm điều gì đó tùy chỉnh / lạ ở đây.
Đây có phải là nơi Magento thực sự áp dụng các ràng buộc Knockout? Hay điều đó xảy ra ở một nơi khác? Hay là Magento đang làm một cái gì đó khó khăn để chặn mã Knockout và xử lý nó ở nơi khác?