ExtJS:如何通过覆盖来调用原始方法?

时间:2016-03-17 19:58:34

标签: javascript extjs extjs4.2

如何从覆盖方法调用原始方法?

我有一个组合框,我从中删除其商店中的一个值,以防止用户选择它,因为我们不再支持该值中的值。如果组合框接收到它,我仍然希望正确显示该值,因为从技术上讲,它不是无效值;它不再受支持。为了实现我的目标,我想覆盖getDisplayValue()方法,这样,如果组合框接收到不再存储在商店中的值,我希望override方法返回正确的字符串,但如果它接收到任何其他值,我想要原始方法来处理它,如下所示:

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()调用时定义的。)

2 个答案:

答案 0 :(得分:2)

即使问题得到解答,这是另一种解决问题的更好方法。这就是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);
    }
});

答案 1 :(得分:0)

如果您使用Ext.define,则在4.1中它是callOverridden,从4.2开始它是callParent

如果你使用Ext.create来创建一个组合框,/login不会带你进入组合框的功能,而是带到基类的功能(triggerfield?),这不是你想要的。

我成功使用过的是这样的:

callParent

但如果你使用Ext.define从默认组合框中派生特殊组合框然后使用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? } }; } }); ,那就更清晰了。