2016-04-22 70 views
1

我有一个简单的重写类。看起来像这样:Sencha Extjs - 正确覆盖方法?

Ext.define('Ext.overrides.form.Panel',{ 
override: 'Ext.form.Panel', 
constructor: function() { 
    this.callParent(arguments); 
}, 
listeners: { 
    afterrender: { 
     fn:function (component, eOpts) { 
      var fields = component.getForm().getFields(); 
      var field = fields.getAt(0); 
      if(typeof field !== 'undefined' && field.isFocusable()) { 
       //need to wait before you can focus a field. 
       Ext.defer(function() { 
        field.focus(true,200); 
       },1); 
      } 
     } 
    } 
} 

});

正如您所看到的,我试图重写afterRender事件,以便窗体渲染后表单中的第一个字段将具有焦点。 这是有效的,除了我的应用程序中的某些表单在自己的afterrender事件中实现一些代码。看起来他们重写了上面定义的这个方法。

我可以将这段代码复制到这些表单中,但是如果我可以使用类似this.callParent(arguments)的方法调用上面的代码,会不会更好。以这些形式? 我已经尝试过,但问题是我的渲染代码为这些窗体是在视图控制器范围内。所以'this'引用将具有Ext.Base的错误范围。

回答

1

这应该工作:

Ext.define('Ext.overrides.form.Panel',{ 
    override: 'Ext.form.Panel', 
    constructor: function() { 
    this.callParent(arguments); 

    this.on({ 
     afterrender: function (component, eOpts) { 
      var fields = component.getForm().getFields(); 
      var field = fields.getAt(0); 
      if(typeof field !== 'undefined' && field.isFocusable()) { 
       //need to wait before you can focus a field. 
       Ext.defer(function() { 
        field.focus(true,200); 
       },1); 
      } 
     } 
    }); 
    } 
}); 
+0

很抱歉这么晚才回复。这个答案有效。但是为什么以这种方式添加监听器而不是将其作为类的初始配置的一部分呢? – Yakaqweri

+0

我在想这是因为on()是addlistener的简写,这意味着我们可以将多个侦听器添加到同一个事件中? – Yakaqweri

+0

如果你在你的问题中使用'listeners',那么你的一些表单就可以覆盖它。 –