Sencha Extjs - 正确覆盖方法?

时间:2016-04-22 05:27:19

标签: javascript class extjs override

我有一个简单的重写课程。看起来像这样:

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 个答案:

答案 0 :(得分: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);
            }
        }
    });
  }
});