【问题标题】:openerp web client 6.1: how to override base javascript functionsopenerp Web 客户端 6.1:如何覆盖基本的 javascript 函数
【发布时间】:2012-02-07 16:51:30
【问题描述】:

我正在寻找一种方法来覆盖一些 openerp web js 核心功能,例如“on_logout”。

文档缺少说明(如您在 my post 中所见),而 helloworld module 告诉您可以这样做

openerp.web_hello = function(openerp) {

openerp.web.SearchView = openerp.web.SearchView.extend({
    init:function() {
        this._super.apply(this,arguments);
        this.on_search.add(function(){console.log('hello');});
    }
});

// here you may tweak globals object, if any, and play with on_* or do_* callbacks on them

openerp.web.Login = openerp.web.Login.extend({
    start: function() {
        console.log('Hello there');
        this._super.apply(this,arguments);
    }
});

};

在我的模块中,我正在这样做:

openerp.mytest = function(openerp){

    openerp.web.WebClient = openerp.web.WebClient.extend({
        on_logout: function() {
            alert('mine');
            [...]
        },
    });
}

我知道 js 已加载,因为在此定义之外放置警报有效。

这里有什么问题?

【问题讨论】:

    标签: client web webclient openerp


    【解决方案1】:

    这是一个特殊的问题,因为您想要更改已经实例化的对象的原型(类,如果您愿意的话)(WebClient 实例是系统的根,所以它可能已经存在于加载代码的时间,因此创建新的 WebClient“类”不会改变现有实例)。

    在这种情况下,您不能用子类替换该类,您必须重新打开该类(以类似于 Ruby 的方式),因为类对象上有一个 include 方法,它 应该工作:

    openerp.mytest = function(openerp) {
        openerp.web.WebClient.include({
            on_logout: function() {
                alert('mine');
                this._super.apply(this, arguments);
            }
        });
    }
    

    (如在 Ruby 中,this._super 绑定到您要替换的方法,如果有的话,用于就地类更改)

    如果您检查 view_list_editable.js 实现文件,它会提供示例,因为它需要重新打开并更改列表视图的代码以添加可编辑性。

    【讨论】:

    • 您好,感谢您的回答。我刚试过这个,但没有用。它继续使用原来的那个。 FWIW 我刚刚提取了最新版本。
    • 天哪,我忘了这是一个“回调”(on_*do_* 方法在 init 期间直接绑定到实例,如果类以某种方式扩展 openerp.web.CallbackEnabled), WebClient 在加载任何模块之前被实例化。您唯一的解决方案是使用原始 javascript,并访问 openerp.webclient(此会话的 webclient 实例,如果有)并直接更改它。像openerp.webclient.on_logout.add_first(function () { console.log('my logout')}); 这样的东西可以工作。替换 on_logout 可能不起作用,因为事件被急切地绑定(一个坏主意)。
    • 我试过了: openerp.mytest = function(openerp) { openerp.webclient.on_logout.add_first( function () { alert('thatsme!'); } ); } 但它似乎也没用:(
    • 好吧,这很奇怪,这基本上就是我添加到“hello”测试/演示模块的内容:openerp.web_hello = function(openerp) { openerp.webclient.on_logout.add_first(function () {alert('thatsme!');});,它会在注销时正确显示警报。您确定没有阻止此代码加载或执行的 javascript 错误吗?
    • 好的,我明白了!以下是它不起作用的原因:a)你不能使用“openerp.web.WebClient”,而是它的别名“openerp.webclient”(就像你在上一个例子中所做的那样)-b)你必须使用你的真实主函数声明的模块名称。我的并不是真正的“mytest”。我用它只是为了提出问题并尝试一下。这是我的错,因为它是文档中指出的少数几件事之一。
    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多