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);
    }
});