如何覆盖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();
    ...
}