Según una lectura muy superficial de la documentación de KnockoutJS, la inicialización de una vista de Knockout muy básica se parece a la siguiente
// 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());
es decir, crea una función javascript destinada a ser utilizada como un constructor de objetos, crea una instancia de un objeto a partir de él y luego pasa ese objeto al ko.applyBindings
método del objeto de eliminación global ( ko
)
Sin embargo, en Magento 2, si carga una página de fondo con una IU de cuadrícula, Magento inicializará el js/core/app.js
módulo 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);
};
});
Este módulo, a su vez, carga el Magento_Ui/js/lib/ko/initialize
módulo, que parece inicializar el uso de KnockoutJS por parte de Magento. Sin embargo, si observa la fuente del módulo de inicialización.
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();
});
Verá que Magento ha llamado el ko.applyBindings();
objeto sin un objeto de vista . Esto no tiene ningún sentido, y no estoy seguro si es mi comprensión limitada de Knockout o de que Magento haga algo personalizado / extraño aquí.
¿Es aquí donde Magento realmente aplica los enlaces de Knockout? ¿O eso sucede en otro lugar? ¿O está haciendo Magento algo complicado para interceptar el código Knockout y procesarlo en otro lugar?