我有几个月的开发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);
}
在控制台中,我可以看到第一个新的layouter打印出消息后跟旧的layouter实现...我放了一个断点并回溯调用堆栈,新的layouter的callParent()
称为旧的。我需要调用父类,而不是重写方法。
知道如何解决这个问题吗?
答案 0 :(得分:20)
如果您使用的是ExtJS 4.1.3或更高版本,则可以使用this.callSuper(arguments)
“跳过”重写的方法并调用超类实现。
该方法的ExtJS documentation提供了以下示例:
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();
}
});
评论:
补丁方法不能使用callParent来调用超类方法,因为这会调用包含错误的重写方法。换句话说,上面的补丁只会在控制台日志中产生“固定”然后“好”,而使用callParent会产生“固定”然后“坏”然后“好”
答案 1 :(得分:4)
您不能使用callParent
,但您可以直接调用祖父母类方法。
GrandparentClass.prototype.finishedLayout.apply(this, arguments);
这是一种更通用(如果有些脆弱)的方法。
this.superclass.superclass[arguments.callee.$name].apply(this, arguments);