Javascript ExtJS:如何从重写调用原始方法?
如何从重写方法调用原始方法 我有一个组合框,我正在从它的存储中删除一个值,以防止用户选择它,因为我们不再支持该值中的该值。如果combobox接收到该值,我仍然希望该值能够正确显示,因为从技术上讲,它不是无效值;它只是不再受支持。为了实现我的目标,我希望重写getDisplayValue()方法,这样,如果组合框接收到不再存储的值,我希望重写方法返回正确的字符串,但是如果它接收到任何其他值,我希望原始方法处理它,如下所示:Javascript ExtJS:如何从重写调用原始方法?,javascript,extjs,extjs4.2,Javascript,Extjs,Extjs4.2,如何从重写方法调用原始方法 我有一个组合框,我正在从它的存储中删除一个值,以防止用户选择它,因为我们不再支持该值中的该值。如果combobox接收到该值,我仍然希望该值能够正确显示,因为从技术上讲,它不是无效值;它只是不再受支持。为了实现我的目标,我希望重写getDisplayValue()方法,这样,如果组合框接收到不再存储的值,我希望重写方法返回正确的字符串,但是如果它接收到任何其他值,我希望原始方法处理它,如下所示: myCombobox = Ext.create("Ext.form.fi
myCombobox = Ext.create("Ext.form.field.ComboBox",
{
// <snip><snip>
getDisplayValue: function()
{
if (this.value == 'removedValue')
{
return 'Correct Text';
}
else
{
// What do I do here to call original getDisplayValue() and return its returned value?
}
}
});
myCombobox=Ext.create(“Ext.form.field.ComboBox”,
{
//
getDisplayValue:函数()
{
if(this.value==“removedValue”)
{
返回“正确文本”;
}
其他的
{
//我在这里要做什么来调用原始getDisplayValue()并返回其返回值?
}
}
});
更新有人发布了一个答案,上面说使用这个。callParent(arguments);但在我留下评论说那不起作用后,他们删除了答案。在else的情况下,我通过从重写函数(我从Sencha的网站上获得)中输入源代码,让重写函数实现了我想要的功能,但如果可能的话,我更愿意使用一种涉及实际调用该函数的解决方案,因为它的源代码可能会在以后的ExtJS更新中更改(例如,修复bug),而我的将保持静态
(请注意,我稍微修改了代码以查看值而不是rawValue,因为在调用getDisplayValue()时不一定定义后者。)如果使用Ext.define,则在4.1中是,而在4.2中是 如果使用Ext.create创建组合框,
callParent
不会将您带到组合框的函数,而是带到基类(triggerfield?)的函数,这不是您想要的
我曾经成功地使用过这样的东西:
Ext.create('MyCombo',{
initComponent:function() {
var me = this;
me.callParent(arguments);
var oldFn = me.getDisplayValue;
me.getDisplayValue = function() {
if (this.rawValue == 'removedValue') {
return 'Correct Text';
} else {
oldFn.apply(this, arguments); // What do I do here to call original getDisplayValue() and return its returned value?
}
};
}
});
但是如果您使用Ext.define从默认的组合框派生特殊的组合框,然后使用
callParent
即使问题已经得到了回答,这是解决问题的另一个更好的方法。这就是ExtJS在一些内部类中如何调用它的parent方法
Ext.create("Ext.form.field.ComboBox", {
getDisplayValue: function() {
if (this.rawValue == 'removedValue') {
// your logic
return;
}
return Ext.form.field.ComboBox.prototype.getDisplayValue.call(this);
}
});
您在回答中输入的代码对我来说不起作用,但定义了一个派生类,该派生类的GetDisplayValue()使用callParent()并从中创建了一个对象。谢谢。我更喜欢这样做。(无需定义派生类。)