2016-04-22 7 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イベントをオーバーライドしようとしています。 これは動作しますが、アプリケーション内のいくつかのフォームでは、アフターレンダーイベントにコードを実装しています。私が上で定義したこの方法をオーバーライドしているようです。

私はこのコードをこれらのフォームにコピーできますが、上記のコードを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'を使うと、フォームの中には単にそれを上書きするだけです。 –

関連する問題