Einfache Methode, bei der Sie KEINE HTML-Vorlagen verwenden müssen
Dank Vinai Kopp habe ich endlich eine Antwort darauf erhalten. Es ist viel einfacher als meine vorherige hackige Problemumgehung (ich habe Knoten gesäubert). Sie müssen lediglich 'ko'
eine Abhängigkeit definieren und Ihren Code in eine Rückgabefunktion einfügen.
Im Folgenden finden Sie ein einfaches Beispiel, in dem über JSON übergebener Text gerendert wird.
app/code/VENODR/MODULE/view/frontend/templates/knockout-example.phtml
Hier teilen wir Magento den Umfang unserer Komponenten mit (dies muss mit data-bind: "scope: 'example-scope'"
zusätzlichen Daten übereinstimmen und diese übergeben. Dies kann die Basis-URL sein, eine einfache Nachricht, so ziemlich alles, was Sie wollen. Ich habe als Beispiel eine Zeichenfolge (PHP-Echo) übergeben
<script type="text/x-magento-init">
{
"*": {
"Magento_Ui/js/core/app": {
"components": {
"example-scope": {
"component": "VENDOR_MODULE/js/knockout-example",
"exampleMessage": "<?= __('Hello Magento Stack Exchange!') ?>"
}
}
}
}
}
</script>
<div data-bind="scope: 'example-scope'">
<h2 data-bind="text: message"></h2>
</div>
Und hier schreiben wir unser Javascript.
app/code/VENDOR/MODULE/view/frontend/web/js/knockout-example.js
define(['ko'], function(ko) {
return function(config) {
this.message = ko.observable(config.exampleMessage);
}
});
Ergebnis
---------------------
Methode, bei der Sie HTML-Vorlagen verwenden müssen
Wenn Sie das HTML-Template-System in Magento2 / Knockout verwenden möchten (das Sie vermutlich für wichtige Arbeiten benötigen), müssen Sie im Vergleich zu meiner vereinfachten Antwort (unten) einige Änderungen vornehmen.
Wenn Sie die Vorlagenfunktionalität nicht benötigen, scrollen Sie nach unten zu meiner alten vereinfachten Antwort.
Die Dateien, die ich für dieses Beispiel verwende, sind:
app/design/frontend/VENDOR/THEME/Magento_Cms/templates/knockout.phtml
app/design/frontend/VENDOR/THEME/Magento_Cms/web/js/knockout-example.js
app/design/frontend/VENDOR/THEME/Magento_Cms/web/template/test.html
Die PHTML-Vorlagendatei
Die einzige Änderung an unserer PHTML-Vorlage ist der Aufruf der getTemplate()
Funktion:
<script type="text/x-magento-init">
{
"*": {
"Magento_Ui/js/core/app": {
"components": {
"example-scope": {
"component": "Magento_Cms/js/knockout-example",
"exampleMessage": "<?= __('Hello Magento Stack Exchange!') ?>"
}
}
}
}
}
</script>
<div data-bind="scope: 'example-scope'">
<h2 data-bind="text: message"></h2>
<!-- ko template: getTemplate() --><!-- /ko -->
</div>
Die JS-Datei (Komponentendatei)
Es gibt einige Änderungen, die Sie an der JS-Datei vornehmen müssen. Ich werde diese unten detailliert beschreiben.
define(['ko', 'uiComponent'], function(ko, Component) {
'use strict';
return Component.extend({
defaults: {
exampleMessage: 'Hello?',
template: 'Magento_Cms/test'
},
initialize: function() {
this._super();
console.log(this.exampleMessage);
this.message = ko.observable(this.exampleMessage);
}
});
});
1 - Ihre Rückgabefunktion muss jetzt das uiComponent-Modul erweitern:
return Component.extend({
...
});
2 - Sie müssen eine initialize
Funktion hinzufügen und aufrufen this._super()
. this._super()
ruft die Funktion der übergeordneten Komponente mit demselben Namen auf. So in diesem Fall ich denke , es nennen wird initialize
von uiComponent
.
initialize: function() {
this._super();
...
}.
3 - Optional - Sie können hier auch einige Standardeinstellungen für Ihre Komponente festlegen. Ich denke, dies ist eine gute Vorgehensweise, da die Arbeit mit Ihrer Komponente einfach ist. Wenn Sie es wiederverwenden, können Sie entweder die Standardeinstellungen beibehalten oder, wenn Sie es anpassen möchten, mit neuen Argumenten aufrufen, ohne die Komponente zu ändern.
Zum Beispiel, wenn Sie auf Ausfälle im JS aussehen setzt es exampleMessage
auf 'Hello?'
noch die Seite gerendert wird , den Text als Hello Magento Stack Exchange!
. Dies liegt daran, dass ich exampleMessage
die PHTML-Datei überschrieben habe, als ich die Komponente aufgerufen habe.
Die HTML-Vorlage
Ich muss mich noch umsehen und sehen, wozu die HTML-Vorlagen in der Lage sind. Ich gehe davon aus, dass die in der Knockout JS-Dokumentation erwähnten Funktionen hier verwendet werden können, um sie ziemlich flexibel zu machen.
Ich habe gerade einen Lorem-Ipsum-Text hinzugefügt. Ich werde wahrscheinlich eine weitere Frage / Antwort geben, sobald ich herausgefunden habe, was die HTML-Vorlagen können.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores assumenda beatae blanditiis culpa cupiditate doloremque, expedita ipsum iure magni minima modi molestiae nulla optio porro ratione reiciendis repellat soluta voluptatum!
Das Ergebnis und das Überschreiben der Standardeinstellungen
Wie bereits erwähnt, können Sie sehen, dass ich exampleMessage
die Vorlage überschrieben habe . Sie können sehen, dass sie beim Lesen des Textes funktioniert Hello Magento Stack Exchange
.
Wenn ich die Überschreibung in der Vorlagendatei entferne, exampleMessage
wird auf die Standardeinstellung von zurückgesetzt Hello?
. Ich musste löschen var/view_preprocessed
und pub/static/frontend
nachdem ich dies geändert hatte. Ich nehme an, Magento hat den Wert zwischengespeichert.