Javascript - 在父母的父母上打电话给超级?

时间:2016-04-02 08:03:32

标签: javascript openerp odoo-8 super

我在Odoo中定义了当前自定义javascript视图的扩展名:

openerp.account_move_journal_test = function(instance){
    var _t = instance.web._t,
        _lt = instance.web._lt;
    var QWeb = instance.web.qweb;
    instance.web.account.QuickAddListView.include({
        init: function(){
            this._super.apply(this, arguments);
            console.log("QuickAddListView modified init")
        },
    });    
};

现在为了更好的表示,我在QuickAddListViewListView中添加了控制台日志,这是使用_super调用的父级。

所以,如果我像这样运行它,我会得到这些照片:

'ListView init'  // This is parent of QuickAddListView
'QuickAddListView Init'
'QuickAddListView modified init'

构造函数的顺序是View - > ListView - > QuickAddListView

因此所有这些都按照应有的方式打印,但我想要的是修改init,直接调用ListView并跳过QuickAddListView原始init }。

所以之后它应该只打印这个(意味着原来的QuickAddListView init没有被调用):

'ListView init'  // This is parent of QuickAddListView
'QuickAddListView modified init'

javascript中是否有指定要调用的确切父级的方法?因此,它不会调用所有内容都在链中,而是从您指定的位置开始(就像在我的情况下从ListView开始)?

例如在Python中,您可以执行以下操作:

from some_module import SomeBaseClass

class CustomBase(SomeBaseClass):
    def m1(self):
        super(CustomBase, self).m1()

class Custom(CustomBase):
    def m1(self):
        # skip CustomBase
        super(CustomBase, self).m1() 

1 个答案:

答案 0 :(得分:3)

  

javascript中有没有办法指定您要调用的确切父级?

是的,您几乎已经这样做了:使用this._super明确引用QuickAddListView的{​​{1}}方法。

  

因此,它不会调用所有内容都在链中,而是从您指定的位置开始?并直接致电init并跳过ListView原始QuickAddListView

对于这种情况,您只需要替换

init

通过

this._super.apply(this, arguments);

(或者您可以访问该课程,不确定Odoo)

但是被警告这是一个绝对的反模式。如果要继承instance.web.ListView.prototype.init.apply(this, arguments); ,则应运行其构造函数(或QuickAddListView方法),以便初始化所需的属性。如果您因任何原因不想要它,您可能不应该继承它,而是直接从init继承。