【问题标题】:Javascript - call super on parents parent?Javascript - 对父母父母打电话超级?
【发布时间】:2016-04-02 08:03:31
【问题描述】:

我已经在 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() 

【问题讨论】:

  • this._super 来自哪里?这通常不会奏效。
  • @Bergi 你是什么意思通常永远不会工作?它内置在 Odoo 中,用于模拟继承/扩展,例如在 Python 中。
  • 啊,I see,那应该没问题。它仅在每次方法调用期间动态设置时才有效,就像它似乎由您的框架提供一样;这种方法不适用于每个实例上的常量 _super

标签: javascript openerp odoo-8 super


【解决方案1】:

在 javascript 中有没有一种方法可以指定您要调用的确切父级?

是的,您几乎已经在这样做了:使用 this._super 显式引用 QuickAddListViewinit 方法。

所以不是称一切都在一个链中,而是从您指定的位置开始?并直接调用ListView跳过QuickAddListViewinit

在这种情况下,您只需要替换该行

this._super.apply(this, arguments);

通过

instance.web.ListView.prototype.init.apply(this, arguments);

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

请注意,这是绝对的反模式。如果你想从QuickAddListView继承,你应该运行它的构造函数(或init方法),以便它可以初始化它需要的属性。如果您出于某种原因不想要它,您可能不应该从它继承,而是直接从 ListView 继承。

【讨论】:

  • 嗯,是的,它有点不符合结构。但我想要这个,因为我想以这种方式修改 QuickAddListView 中的函数很少。对于init,我会重写QuickAddListView 中的一些属性,但不是全部,因为我需要跳过一些。但是对于其他功能,它们应该与原始QuickAddListView 中的功能相同,所以这就是我考虑这样做的原因。明天我回到我的工作电脑上,我会检查你的答案。
  • 我认为您应该调用QuickAddListView,然后手动取消设置/重置/优化您不需要或需要不同的属性。这样一来,您真正在做什么就会更加明确和明显。
  • init 来说这没什么大不了的。我真的可以打电话给QuickAddListView。但是对于我需要修改的其他方法(我的意思是函数),我看不到如何做到这一点。我的意思是如果我从QuickAddListView 打电话给它,那就太迟了。换句话说,它会做我试图阻止的动作。例如,它会创建/修改一些记录。但是如果我直接从ListView 调用某个函数,那么我可以重写特定的操作(这意味着要在QuickAddListView 中完成)。不知道我解释清楚没有。
  • 啊,是的,对于其他方法来说,这没什么大不了的。
  • 我试过你的建议和它的工作。所以如果有人需要这个,你应该将instance.web.account.ListView.prototype.init.apply 更改为instance.web.ListView.prototype.init.apply,因为那是ListView init 的路径。然后我会接受你的回答。
猜你喜欢
  • 2012-05-17
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多