如何覆盖odoo 9中邮件模块的mail.chatter js?
How to Override mail.chatter js of mail module in odoo 9?
我想覆盖 ChatterComposer 函数,即
init: function (parent, dataset, options) {
this._super(parent, options);
this.thread_dataset = dataset;
this.suggested_partners = [];
this.options = _.defaults(this.options, {
display_mode: 'textarea',
record_name: false,
is_log: false,
internal_subtypes: [],
});
if (this.options.is_log) {
this.options.send_text = _t('Log');
}
this.events = _.extend(this.events, {
'click .o_composer_button_full_composer': 'on_open_full_composer',
});
},
和 Chatter 功能,即
open_composer: function (options) {
var self = this;
var old_composer = this.composer;
// create the new composer
this.composer = new ChatterComposer(this, this.thread_dataset, {
context: this.context,
input_min_height: 50,
input_max_height: Number.MAX_VALUE, // no max_height limit for the chatter
input_baseline: 14,
internal_subtypes: this.options.internal_subtypes,
is_log: options && options.is_log,
record_name: this.record_name,
default_body: old_composer && old_composer.$input && old_composer.$input.val(),
default_mention_selections: old_composer && old_composer.mention_get_listener_selections(),
});
this.composer.on('input_focused', this, function () {
this.composer.mention_set_prefetched_partners(this.mention_suggestions || []);
});
this.composer.insertBefore(this.$('.o_mail_thread')).then(function () {
// destroy existing composer
if (old_composer) {
old_composer.destroy();
}
if (!config.device.touch) {
self.composer.focus();
}
self.composer.on('post_message', self, self.on_post_message);
self.composer.on('need_refresh', self, self.refresh_followers);
self.composer.on('close_composer', null, self.close_composer.bind(self, true));
});
this.mute_new_message_button(true);
},
共 chatter.js.
所以我尝试了下面的代码,但它显示了一个错误,即一些模块无法启动并且在错误部分显示,无法读取属性 'extend' 未定义
odoo.define('demo.call', function (require) {
"use strict";
var composer = require('mail.composer');
var chatter = require('mail.Chatter');
chatter.ChatterComposer.extend({
//code here
});
});
当我使用 extend 时,它抛出一个错误,Cannot read 属性 'extend' of undefined,当我使用 include 而不是 extent 时,它抛出错误 无法读取未定义的 属性 'include'。请与我分享任何想法,如何解决这个问题。
如果您查看 chatter.js,您会发现它只是 returns Chatter。在 Chatter 代码中,您会看到它包含的 ChatterComposer 实例称为 composer:
this.composer = new ChatterComposer(...)
这就是为什么 chatter.ChatterComposer 在您的代码中未定义的原因。
如果您必须覆盖 ChatterComposer 的 init 方法,那么您可以将 chatter.js return 修改为 return,Chatter 和 ChatterComposer 如下所示:
return {
'Chatter': Chatter,
'ChatterComposer': ChatterComposer,
}
但是,您需要修复所有对 require('mail.Chatter') 的引用,将其更改为 require('mail.Chatter').Chatter...
相反,我建议您像这样创建自己的作曲家(您甚至可以复制当前的 ChatterComposer 并只修改 init 方法):
var MyCustomChatterComposer = form_common.AbstractField.extend({...})
然后通过覆盖 open_composer 函数并调用您的自定义聊天编写器来替换 Chatter:
var chatter = require('mail.Chatter');
chatter.open_composer = function (options) {
...
chatter.composer = new MyCustomChatterComposer();
...
}
我想覆盖 ChatterComposer 函数,即
init: function (parent, dataset, options) {
this._super(parent, options);
this.thread_dataset = dataset;
this.suggested_partners = [];
this.options = _.defaults(this.options, {
display_mode: 'textarea',
record_name: false,
is_log: false,
internal_subtypes: [],
});
if (this.options.is_log) {
this.options.send_text = _t('Log');
}
this.events = _.extend(this.events, {
'click .o_composer_button_full_composer': 'on_open_full_composer',
});
},
和 Chatter 功能,即
open_composer: function (options) {
var self = this;
var old_composer = this.composer;
// create the new composer
this.composer = new ChatterComposer(this, this.thread_dataset, {
context: this.context,
input_min_height: 50,
input_max_height: Number.MAX_VALUE, // no max_height limit for the chatter
input_baseline: 14,
internal_subtypes: this.options.internal_subtypes,
is_log: options && options.is_log,
record_name: this.record_name,
default_body: old_composer && old_composer.$input && old_composer.$input.val(),
default_mention_selections: old_composer && old_composer.mention_get_listener_selections(),
});
this.composer.on('input_focused', this, function () {
this.composer.mention_set_prefetched_partners(this.mention_suggestions || []);
});
this.composer.insertBefore(this.$('.o_mail_thread')).then(function () {
// destroy existing composer
if (old_composer) {
old_composer.destroy();
}
if (!config.device.touch) {
self.composer.focus();
}
self.composer.on('post_message', self, self.on_post_message);
self.composer.on('need_refresh', self, self.refresh_followers);
self.composer.on('close_composer', null, self.close_composer.bind(self, true));
});
this.mute_new_message_button(true);
},
共 chatter.js.
所以我尝试了下面的代码,但它显示了一个错误,即一些模块无法启动并且在错误部分显示,无法读取属性 'extend' 未定义
odoo.define('demo.call', function (require) {
"use strict";
var composer = require('mail.composer');
var chatter = require('mail.Chatter');
chatter.ChatterComposer.extend({
//code here
});
});
当我使用 extend 时,它抛出一个错误,Cannot read 属性 'extend' of undefined,当我使用 include 而不是 extent 时,它抛出错误 无法读取未定义的 属性 'include'。请与我分享任何想法,如何解决这个问题。
如果您查看 chatter.js,您会发现它只是 returns Chatter。在 Chatter 代码中,您会看到它包含的 ChatterComposer 实例称为 composer:
this.composer = new ChatterComposer(...)
这就是为什么 chatter.ChatterComposer 在您的代码中未定义的原因。
如果您必须覆盖 ChatterComposer 的 init 方法,那么您可以将 chatter.js return 修改为 return,Chatter 和 ChatterComposer 如下所示:
return {
'Chatter': Chatter,
'ChatterComposer': ChatterComposer,
}
但是,您需要修复所有对 require('mail.Chatter') 的引用,将其更改为 require('mail.Chatter').Chatter...
相反,我建议您像这样创建自己的作曲家(您甚至可以复制当前的 ChatterComposer 并只修改 init 方法):
var MyCustomChatterComposer = form_common.AbstractField.extend({...})
然后通过覆盖 open_composer 函数并调用您的自定义聊天编写器来替换 Chatter:
var chatter = require('mail.Chatter');
chatter.open_composer = function (options) {
...
chatter.composer = new MyCustomChatterComposer();
...
}