Método simple donde NO necesita usar plantillas html
Gracias a Vinai Kopp, finalmente obtuve una respuesta a esto, es mucho más simple que mi solución alternativa anterior (estaba limpiando nodos). Todo lo que necesita hacer es definir 'ko'
como una dependencia y agregar su código dentro de una función de retorno.
A continuación se muestra un ejemplo simple que muestra parte del texto pasado a través de JSON.
app/code/VENODR/MODULE/view/frontend/templates/knockout-example.phtml
Aquí le decimos a Magento el alcance de nuestros componentes (esto debe coincidir data-bind: "scope: 'example-scope'"
y pasar cualquier información adicional. Esta podría ser la URL base, un mensaje simple, casi cualquier cosa que desee. He pasado una cadena (PHP echo) como ejemplo
<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>
Y aquí escribimos nuestro 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);
}
});
Resultado
---------------------
Método donde necesita usar plantillas HTML
Si desea utilizar el sistema de plantillas HTML dentro de Magento2 / Knockout (que supongo que necesitará para cualquier trabajo significativo), debe realizar algunos cambios en comparación con mi respuesta simplificada (a continuación).
Si no necesita la funcionalidad de la plantilla, desplácese hacia abajo hasta mi antigua respuesta simplificada.
Los archivos que estoy usando para este ejemplo son:
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
El archivo de plantilla PHTML
El único cambio en nuestra plantilla PHTML es la llamada a la getTemplate()
función:
<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>
El archivo JS (componente)
Hay algunos cambios que deberá realizar en el archivo JS, los detallaré a continuación.
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 - Su función de retorno ahora necesita extender el módulo uiComponent:
return Component.extend({
...
});
2 - Necesita agregar una initialize
función y llamar this._super()
. this._super()
llamará a la función del componente principal con el mismo nombre. Así que en este caso lo que se llamará initialize
de uiComponent
.
initialize: function() {
this._super();
...
}.
3 - Opcional : también puede establecer algunos valores predeterminados para su componente aquí, creo que es una buena práctica a seguir, ya que hace que su componente sea fácil de trabajar. Cuando lo reutiliza, puede mantener los valores predeterminados o, si desea personalizarlo, puede llamarlo con nuevos argumentos sin alterar el componente.
Por ejemplo, si nos fijamos en los valores predeterminados de la JS establece exampleMessage
que 'Hello?'
sin embargo, la página se visualice el texto Hello Magento Stack Exchange!
. Esto se debe a que he sobrescrito exampleMessage
en el archivo PHTML cuando llamé al componente.
La plantilla HTML
Todavía tengo que investigar y ver de qué son capaces las plantillas HTML, supongo que las características mencionadas en la documentación de Knockout JS se pueden usar aquí, lo que las hace bastante flexibles.
Acabo de agregar un poco de texto lorem ipsum por ahora, probablemente proporcionaré otra pregunta / respuesta una vez que haya descubierto lo que pueden hacer las plantillas HTML.
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!
El resultado y sobrescribir los valores predeterminados
Como se mencionó anteriormente, puede ver que he sobrescrito exampleMessage
dentro de la plantilla, puede ver que funciona mientras se lee el texto Hello Magento Stack Exchange
.
Si elimino la anulación en el archivo de plantilla exampleMessage
, volverá a su valor predeterminado Hello?
. Necesité eliminar var/view_preprocessed
y pub/static/frontend
después de cambiar esto sin embargo. Supongo que Magento había almacenado en caché el valor.