Как исправить ошибку «невозможно вызвать методы автозаполнения перед инициализацией; попытка вызвать виджет метода» в Odoo 10? - PullRequest
0 голосов
/ 13 ноября 2018

Я создал свой собственный виджет. Когда выполняется действие X, вызывается мой метод init_product_tmpl_id. Этот метод генерирует в JavaScript поле Many2one , подобное тому, которое мы используем для создания в Python для выбора продукта.

Все в порядке с этим методом. И каждый раз, когда пользователь выбирает новый продукт, я хочу выполнить другое действие. Вот почему я написал внутри метода часть this.product_tmpl_m2o.on('change:value', self, function() { ... }), как вы можете видеть.

Действие, которое я хочу выполнить, - динамически создать поле Many2many для выбора налогов. Я делаю это, используя тот же DefaultFieldManager (я не уверен, хорошая ли это идея или нет).

Каждый раз, когда продукт модифицируется, мне нужно заменить старый Множество налогов на новый. Чтобы добиться этого, я снова переопределяю Many2many и использую метод remove для удаления его DOM и prependTo для его генерации.

Проблема в том, что я удаляю DOM:

self.$('tr.oe_product_tmpl_addition td.oe_product_tmpl_taxes_add span>div').remove();

Тот, кто дает мне ошибку:

Uncaught Error: невозможно вызвать методы при автозаполнении до инициализация; попытался вызвать метод 'widget'

После того, как много погуглил и попробовал несколько способов решить эту проблему, я почти сдался. Кажется, что класс ui-autocomplete отсутствует, и это необходимо по какой-то причине. Я попытался добавить его (вы можете увидеть три попытки с комментариями) и многие другие обходные пути, но безуспешно.

Это код:

init_product_tmpl_id: function() {
    this.destroy_content();
    var self = this;
    this.dfm = new form_common.DefaultFieldManager(this);
    this.dfm.extend_field_desc({
        product_tmpl_id: {
            relation: 'product.template',
        },
    });
    var FieldMany2One = core.form_widget_registry.get('many2one');
    this.product_tmpl_m2o = new FieldMany2One(this.dfm, {
        attrs: {
            name: 'product_tmpl_id',
            type: 'many2one',
            modifiers: JSON.stringify({
                required: true,
                readonly: this.get('effective_readonly'),
            }),
        },
    });
    this.product_tmpl_m2o.prependTo(this.$('tr.oe_product_tmpl_addition td.oe_product_tmpl_id')).then(function() {
        self.product_tmpl_m2o.$el.addClass('oe_edit_only');
    });

    // ONCHANGE PRODUCT TEMPLATE

    this.product_tmpl_m2o.on('change:value', self, function() {
        var id = self.product_tmpl_m2o.get_value();
        if (id === false) {
            self.dfm.set({display_invalid_fields: true});
            return;
        }
        else {
            self.dfm.extend_field_desc({
                tax_id: {
                    relation: 'account.tax',
                },
            });
            var FieldMany2manyTags = core.form_widget_registry.get('many2many_tags');
            self.taxes_m2m = new FieldMany2manyTags(self.dfm, {
                attrs: {
                    name: 'tax_id',
                    type: 'many2many',
                },
            });
            self.$('tr.oe_product_tmpl_addition td.oe_product_tmpl_taxes_add span>div').remove();
            self.taxes_m2m.prependTo(self.$('tr.oe_product_tmpl_addition td.oe_product_tmpl_taxes_add span')).then(function() {
                // self.taxes_m2m.$el.append($('ul.ui-autocomplete'));
                // self.taxes_m2m.$el.find('ul').addClass('ui-autocomplete');
                // self.taxes_m2m.$el.find('input').autocomplete();
                self.taxes_m2m.$el.addClass('oe_edit_only');
            });
        };
    });

Кто-нибудь знает, как исправить эту ошибку или идею сделать это лучше? Отсутствие документации по Odoo JS и отсутствие примеров в стандартных модулях Odoo делают это очень сложным.

...