Nach einer sehr flüchtigen Lektüre der KnockoutJS-Dokumentation sieht das Initialisieren einer sehr einfachen Knockout-Ansicht folgendermaßen aus
// 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());
dh - Sie erstellen eine JavaScript-Funktion, die als Objektkonstruktor verwendet werden soll, instanziieren ein Objekt daraus und übergeben dieses Objekt dann an die ko.applyBindings
Methode des globalen Knockout-Objekts ( ko
).
Wenn Sie jedoch in Magento 2 eine Backend-Seite mit einer Raster-Benutzeroberfläche laden, initialisiert Magento das js/core/app.js
RequireJS-Modul
/**
* 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);
};
});
Dieses Modul lädt wiederum das Magento_Ui/js/lib/ko/initialize
Modul, das Magentos Verwendung von KnockoutJS zu initialisieren scheint . Betrachten Sie jedoch die Quelle des Initialisierungsmoduls.
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();
});
Sie sehen, dass Magento das ko.applyBindings();
Objekt ohne Ansichtsobjekt nennt . Das ergibt keinen Sinn und ich bin mir nicht sicher, ob es sich um mein begrenztes Verständnis von Knockout handelt oder ob Magento hier etwas Besonderes macht.
Wendet Magento hier tatsächlich Knockout-Bindungen an? Oder passiert das woanders? Oder tut Magento etwas Schwieriges, um Knockout-Code abzufangen und woanders zu verarbeiten?