Cách viết lại chức năng widget với mixins Magento 2.1.1


17

Chúng ta có swatch-renderer.js

Trong tập tin này có một số vật dụng.

....
    $.widget('mage.SwatchRenderer', {
....

    /**
     * @private
     */
    _init: function () {
        if (this.options.jsonConfig !== '' && this.options.jsonSwatchConfig !== '') {
            this._sortAttributes();
            this._RenderControls();
        } else {
            console.log('SwatchRenderer: No input data received');
        }
    },

    /**
     * @private
     */
    _sortAttributes: function () {
        this.options.jsonConfig.attributes = _.sortBy(this.options.jsonConfig.attributes, function (attribute) {
            return attribute.position;
        });
    },

Tôi muốn viết lại một số chức năng của nó.

Cách thích hợp để làm điều đó là gì?

Giải thích trong thư viện magento không còn thực tế nữa, chúng được liên kết trên các lớp đang sử dụng một cách tiếp cận khác (tôi đang nói về place-order.js / place-order-mixin.js). Và các ví dụ được mô tả không giải thích bằng cách nào đó để viết lại các chức năng của widget.

Câu trả lời:


38

Yêu cầu-config.js

var config = {
    config: {
        mixins: {
            'Magento_Swatches/js/swatch-renderer': {
                'path/to/your/mixin': true
            }
        }
    }
};

đường dẫn / đến / của bạn / mixin.js

define([
    'jquery'
], function ($) {
    'use strict';

    return function (widget) {

        $.widget('mage.SwatchRenderer', widget, {
            _Rebuild: function () {
                console.log('Hello from rebuild', arguments);
                return this._super();
            }
        });

        return $.mage.SwatchRenderer;
    }
});

3

Chỉnh sửa: câu trả lời của tôi không sử dụng mixins. Theo hiểu biết của tôi, mixins chỉ hoạt động cho các phương thức viết lại và các thuộc tính. Trong trường hợp của bạn, đó là JS thuần túy được gọi trực tiếp bên ngoài một phương thức.

Bạn có thể làm điều đó thông qua một mô-đun.

Trong Vendor/Module/view/frontend/requirejs-config.jsbạn có thể thêm như sau:

var config = {
    map: {
        '*': {
            'Magento_Swatches/js/swatch-renderer':'Vendor_Module/js/swatch-renderer'
        }
    }
};

Sau đó, bạn có thể tạo Vendor/Module/view/frontend/web/js/swatch-renderer.jstệp bằng cách sao chép swatch-renderer.jstệp gốc và sửa đổi nội dung của tệp dựa trên những gì bạn muốn làm.


Raphael , xin lỗi vì đã không trả lời trong thời gian dài. Không có thời gian rảnh. Nói cách khác, không có cách thích hợp để viết lại các phương thức widget? Chỉ viết lại đầy đủ hoàn chỉnh? Ý tôi là nếu magento cập nhật tập tin hiện có - chúng tôi sẽ cần cập nhật việc viết lại.
zhartaunik

@zhartaunik hoàn toàn có thể viết lại các phương thức widget bằng mixins. Vấn đề trong trường hợp của bạn là tệp swatch-renderer không có bất kỳ phương thức nào, đó là một tập lệnh duy nhất. Do đó, chúng tôi không thể sử dụng mixins và do đó phải viết lại đầy đủ. AFAIK đó là cách duy nhất để làm điều đó
Raphael tại Digital Pianism

@RaphaelatDigitalPianism Tôi vừa cố gắng làm điều tương tự như bạn mô tả nhưng liên tục nhận được Uncaught TypeError: base is not a constructor- có ý tưởng nào tại sao không? Cảm ơn
Tom Burman

Bạn sẽ có thể viết lại SwatchRendererwidget bằng mixin vì hàm được truyền vào definecó ở cuối return $.mage.SwatchRenderer;. Tôi không biết về các tiện ích khác được xác định trong cùng một tệp SwatchRendererTooltip.
che khuất
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.