我创建了自己的小部件。当执行X动作时,将调用我的方法init_product_tmpl_id
。此方法在JavaScript中生成一个 Many2one 字段,该字段类似于我们在Python中用于创建产品的字段。
该方法一切正常。而且,每当用户选择一个新产品时,我都想执行另一个操作。如您所见,这就是为什么我在方法内编写this.product_tmpl_m2o.on('change:value', self, function() { ... })
的一部分。
我要执行的操作是动态创建一个 Many2many 字段,以选择税金。我正在使用相同的DefaultFieldManager
进行制作(不确定是否是个好主意)。
每次修改产品时,我都需要用新的替换旧的Many2many税。为此,我再次重新定义 Many2many ,并使用remove
方法删除其DOM,并使用prependTo
重新生成它。
问题是我删除DOM所在的行:
self.$('tr.oe_product_tmpl_addition td.oe_product_tmpl_taxes_add span>div').remove();
那是给我的错误:
未捕获的错误:无法在自动完成之前调用方法 初始化;尝试调用方法“部件”
经过大量的搜索并尝试了多种解决方法后,我几乎放弃了。看来类ui-autocomplete
丢失了,出于某种原因这是必需的。我试图添加它(您可以看到有3次尝试被评论)和许多其他解决方法,但是没有办法。
这是代码:
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标准模块中缺少的示例使这一点变得非常困难。