Простий метод, де НЕ потрібно використовувати HTML-шаблони
Завдяки Вінаю Коппу я нарешті отримав відповідь на це, це набагато простіше, ніж у моєму попередньому хакітному вирішенні (я прибирав вузли). Все, що вам потрібно зробити, це визначити 'ko'
як залежність і додати свій код у функцію повернення.
Нижче наводиться простий приклад, який відображає текст, переданий через JSON.
app/code/VENODR/MODULE/view/frontend/templates/knockout-example.phtml
Тут ми розповідаємо Magento про сферу наших компонентів (це повинно відповідати data-bind: "scope: 'example-scope'"
і передавати будь-які додаткові дані. Це може бути базова URL-адреса, просте повідомлення, майже все, що вам потрібно. Я передав рядок (PHP-відлуння) як приклад
<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>
І тут ми пишемо наш 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);
}
});
Результат
---------------------
Метод, де НЕ потрібно використовувати шаблони HTML
Якщо ви хочете використовувати систему шаблонів HTML в Magento2 / Knockout (я вважаю, що вам знадобиться для будь-яких значних робіт), вам потрібно внести кілька змін порівняно з моєю спрощеною відповіддю (нижче).
Якщо вам не потрібна функціональність шаблону, тоді прокрутіть униз до моєї старої спрощеної відповіді.
Для цього прикладу використовуються файли:
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
Файл шаблону PHTML
Єдина зміна нашого шаблону PHTML - це виклик getTemplate()
функції:
<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>
Файл JS (компонент)
У файл JS потрібно внести декілька змін, я детально опишу їх нижче.
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 - Тепер ваша функція повернення повинна розширити модуль uiComponent:
return Component.extend({
...
});
2 - Вам потрібно додати initialize
функцію та зателефонувати this._super()
. this._super()
викличе функцію батьківського компонента з тим самим іменем. Так що в даному випадку я думаю , що він буде викликати initialize
з uiComponent
.
initialize: function() {
this._super();
...
}.
3 - Необов’язково - Ви також можете встановити деякі типові параметри для свого компонента тут, я думаю, що це є хорошою практикою, яку слід дотримуватися, оскільки це полегшує роботу з вашим компонентом. При повторному використанні ви можете або зберегти за замовчуванням, або, якщо ви хочете налаштувати його, ви можете викликати його новими аргументами, не змінюючи компонент.
Наприклад, якщо ви дивитеся на значення по замовчуванням в JS вона встановлює exampleMessage
на 'Hello?'
ще сторінка робить текст як Hello Magento Stack Exchange!
. Це тому, що я перезаписався exampleMessage
у файл PHTML, коли я викликав компонент.
Шаблон HTML
Я все ще копаюся і бачу, на що здатні шаблони HTML, я припускаю, що функції, згадані в документації на Knockout JS, можна використовувати тут, роблячи їх досить гнучкими.
Я щойно додав текст lorem ipsum, я, швидше за все, надам ще одне питання / відповідь, як тільки я зрозумію, що можуть робити шаблони 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!
Результат і перезапис за замовчуванням
Як згадувалося раніше, ви можете побачити, що я переписав exampleMessage
всередині шаблону, ви можете бачити його, як текст читається Hello Magento Stack Exchange
.
Якщо я видалю перезапис у файлі шаблону, exampleMessage
він повернеться до значень за замовчуванням Hello?
. Мені потрібно було видалити var/view_preprocessed
і pub/static/frontend
після зміни цього, хоча. Я припускаю, що Magento кеширував цінність.