Phương pháp đơn giản mà bạn KHÔNG cần sử dụng các mẫu html
Cảm ơn Vinai Kopp, cuối cùng tôi đã có câu trả lời cho vấn đề này, nó đơn giản hơn nhiều so với cách giải quyết trước đây của tôi (tôi đã làm sạch các nút). Tất cả những gì bạn cần làm là xác định 'ko'
là một phụ thuộc và thêm mã của bạn vào trong hàm trả về.
Dưới đây là một ví dụ đơn giản thể hiện một số văn bản được truyền qua JSON.
app/code/VENODR/MODULE/view/frontend/templates/knockout-example.phtml
Ở đây chúng tôi nói với Magento phạm vi của các thành phần của chúng tôi (điều này phải khớp data-bind: "scope: 'example-scope'"
và chuyển bất kỳ dữ liệu bổ sung nào. Đây có thể là URL cơ sở, một thông điệp đơn giản, gần như mọi thứ bạn muốn. Tôi đã truyền một chuỗi (tiếng vang PHP) làm ví dụ
<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>
Và ở đây chúng tôi viết Javascript của chúng tôi.
app/code/VENDOR/MODULE/view/frontend/web/js/knockout-example.js
define(['ko'], function(ko) {
return function(config) {
this.message = ko.observable(config.exampleMessage);
}
});
Kết quả
---------------------
Phương pháp bạn cần sử dụng các mẫu HTML
Nếu bạn muốn sử dụng hệ thống tạo khuôn mẫu HTML trong Magento2 / Knockout (mà tôi cho rằng bạn sẽ cần cho bất kỳ phần công việc quan trọng nào), có một vài thay đổi bạn sẽ cần thực hiện so với câu trả lời đơn giản của tôi (bên dưới).
Nếu bạn không yêu cầu chức năng mẫu thì hãy cuộn xuống câu trả lời đơn giản cũ của tôi.
Các tệp tôi đang sử dụng cho ví dụ này là:
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
Tệp mẫu PHTML
Thay đổi duy nhất đối với mẫu PHTML của chúng tôi là lệnh gọi getTemplate()
hàm:
<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>
Tệp JS (thành phần)
Có một vài thay đổi bạn sẽ cần thực hiện đối với tệp JS, tôi sẽ trình bày chi tiết những điều dưới đây.
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 - Hàm trả về của bạn bây giờ cần mở rộng mô-đun uiComponent:
return Component.extend({
...
});
2 - Bạn cần thêm một initialize
chức năng và gọi this._super()
. this._super()
sẽ gọi hàm của thành phần cha có cùng tên. Vì vậy, trong trường hợp này tôi nghĩ rằng nó sẽ gọi initialize
của uiComponent
.
initialize: function() {
this._super();
...
}.
3 - Tùy chọn - Bạn cũng có thể đặt một số giá trị mặc định cho thành phần của mình ở đây, tôi nghĩ rằng đây là một cách thực hành tốt vì nó làm cho thành phần của bạn dễ làm việc. Khi bạn sử dụng lại, bạn có thể giữ mặc định hoặc nếu bạn muốn tùy chỉnh nó, bạn có thể gọi nó với các đối số mới mà không thay đổi thành phần.
Ví dụ: nếu bạn nhìn vào các giá trị mặc định trong JS, nó sẽ đặt exampleMessage
thành 'Hello?'
trang đang hiển thị văn bản dưới dạng Hello Magento Stack Exchange!
. Điều này là do tôi đã ghi đè lên exampleMessage
tệp PHTML khi tôi gọi thành phần này.
Mẫu HTML
Tôi vẫn đang tìm hiểu kỹ xem các mẫu HTML có khả năng gì, tôi cho rằng các tính năng được đề cập trong tài liệu Knockout JS có thể được sử dụng ở đây khiến chúng khá linh hoạt.
Bây giờ tôi mới thêm một số văn bản ipsum lorem, tôi có thể sẽ cung cấp một câu hỏi / câu trả lời khác một khi tôi đã tìm ra những gì các mẫu HTML có thể làm.
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!
Kết quả và ghi đè mặc định
Như đã đề cập trước khi bạn có thể thấy rằng tôi đã ghi đè exampleMessage
trong mẫu, bạn có thể thấy nó hoạt động như văn bản đã đọc Hello Magento Stack Exchange
.
Nếu tôi loại bỏ ghi đè trong tệp mẫu exampleMessage
sẽ trở về mặc định của nó Hello?
. Tôi đã cần phải xóa var/view_preprocessed
và pub/static/frontend
sau khi thay đổi điều này mặc dù. Tôi đoán Magento đã lưu trữ giá trị.