重写Extjs类和调用callParent方法。

17

我有几个月的Extjs Web应用程序开发经验。我遇到了这个问题:

当我重写一个类时,我修改了方法并按照以前的实现方式调用了 callParent()。重写部分起作用了,但是 callParent() 调用的是旧的实现。

我的重写代码

Ext.override(Ext.layout.component.Draw, {
    finishedLayout: function (ownerContext) {

        console.log("new layouter being overriden");
        this.callParent(arguments);
    }
});

需要覆盖的 Extjs 类方法:

finishedLayout: function (ownerContext) {
    var props = ownerContext.props,
        paddingInfo = ownerContext.getPaddingInfo();

    console.log("old layouter being overriden");
    this.owner.setSurfaceSize(props.contentWidth - paddingInfo.width, props.contentHeight - paddingInfo.height);

    this.callParent(arguments);
}

在控制台中,我可以看到新的布局器首先打印出消息,然后是旧的布局器实现... 我设置了断点并重新跟踪调用堆栈,新布局器的callParent()调用了旧的布局器。我需要调用父类,但不是被覆盖的方法。

有什么解决这个问题的想法吗?


很抱歉没有提供我使用的版本,我正在使用ExtJs 4.1.2。所选择的答案是正确的方法,但我无法使用它,而是使用了@wantok提供的答案。 - Seng Zhe
顺便说一下,绕过你的一个超级用户是一个很大的黑客行为,明智而谨慎地使用它! - Ruan Mendes
2个回答

21
如果您使用的是ExtJS 4.1.3或更高版本,您可以使用this.callSuper(arguments)来“跳过”被覆盖的方法并调用超类实现。
该方法的ExtJS文档提供了以下示例:
Ext.define('Ext.some.Class', {
    method: function () {
        console.log('Good');
    }
});

Ext.define('Ext.some.DerivedClass', {
    method: function () {
        console.log('Bad');

        // ... logic but with a bug ...

        this.callParent();
    }
});

Ext.define('App.patches.DerivedClass', {
    override: 'Ext.some.DerivedClass',

    method: function () {
        console.log('Fixed');

        // ... logic but with bug fixed ...

        this.callSuper();
    }
});

并且有评论:

由于这会调用包含错误的被覆盖方法,因此patch方法无法使用callParent调用超类方法。换句话说,上面的补丁只会在控制台日志中产生“已修复”然后是“良好”,而使用callParent将产生“已修复”然后是“糟糕”然后是“良好”。


警告:在第三个示例中,当使用“override”时,有时this.callSuper();会在控制台触发错误。如果这种情况发生在您身上,您应该尝试使用this.callOverridden(arguments);代替。 相关主题 - Olympiloutre

6
你不能使用 callParent,但你可以直接调用祖先类的方法。
GrandparentClass.prototype.finishedLayout.apply(this, arguments);

这里有一种更通用(虽然有些脆弱)的方法。
this.superclass.superclass[arguments.callee.$name].apply(this, arguments);

我认为这更清晰,因为它显示了您的意图。特别是跳过重写方法似乎像是一种hack。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接