ExtJS:如何从覆盖中调用原始方法?
ExtJS: How to call original method from an override?
如何从覆盖方法中调用原始方法?
我有一个组合框,我正在从它的存储中删除其中一个值,以防止用户选择它,因为我们不再支持该值中的该值。如果组合框收到该值,我仍然希望该值能够正确显示,因为从技术上讲,它不是无效值;它只是不再受支持。为了实现我的目标,我想覆盖 getDisplayValue() 方法,这样,如果组合框收到的值不再存在于商店中,我希望覆盖方法 return 正确的字符串,但是如果它收到任何其他值,我希望原始方法处理它,如下所示:
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?
}
}
});
更新
有人发布了一个答案说使用 this.callParent(arguments);但是在我发表评论说那行不通之后,他们删除了答案。我得到了覆盖函数来做我想在其他情况下做的事情,方法是从被覆盖的函数(我从 Sencha 的网站上获得)中放入源代码,但我宁愿使用一个涉及某种方式实际调用的解决方案如果可能的话,该函数会被替代,因为它的源代码可能会在以后的 ExtJS 更新中发生变化(例如,为了修复错误),而我的将保持不变。
(请注意,我稍微更改了代码以查看值而不是 rawValue,因为后者不一定在调用 getDisplayValue() 时定义。)
如果您使用 Ext.define,在 4.1 中它是 callOverridden
, and since 4.2 it is callParent
。
如果你使用Ext.create创建一个组合框,callParent
不会带你到组合框的功能,而是带你到基地class(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 在其内部 类.
中调用父方法的方式
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() 方法,这样,如果组合框收到的值不再存在于商店中,我希望覆盖方法 return 正确的字符串,但是如果它收到任何其他值,我希望原始方法处理它,如下所示:
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?
}
}
});
更新
有人发布了一个答案说使用 this.callParent(arguments);但是在我发表评论说那行不通之后,他们删除了答案。我得到了覆盖函数来做我想在其他情况下做的事情,方法是从被覆盖的函数(我从 Sencha 的网站上获得)中放入源代码,但我宁愿使用一个涉及某种方式实际调用的解决方案如果可能的话,该函数会被替代,因为它的源代码可能会在以后的 ExtJS 更新中发生变化(例如,为了修复错误),而我的将保持不变。
(请注意,我稍微更改了代码以查看值而不是 rawValue,因为后者不一定在调用 getDisplayValue() 时定义。)
如果您使用 Ext.define,在 4.1 中它是 callOverridden
, and since 4.2 it is callParent
。
如果你使用Ext.create创建一个组合框,callParent
不会带你到组合框的功能,而是带你到基地class(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 在其内部 类.
中调用父方法的方式Ext.create("Ext.form.field.ComboBox", {
getDisplayValue: function() {
if (this.rawValue == 'removedValue') {
// your logic
return;
}
return Ext.form.field.ComboBox.prototype.getDisplayValue.call(this);
}
});