2011-10-26 6 views
0

大規模なExtJS3コードベースを継承し、Ext.grid.CellSelectionModelのbeforecellselectの「基本」オーバーライドがあります。次のようにその後ExtJSイベントの再定義と以前の実装への委任

Ext.override(Ext.grid.CellSelectionModel, { 
    init:function() { 
     Ext.grid.CellSelectionModel.superclass.init.apply(this, arguments); 

     if (this.unselectableColumns || this.visuallyMimicRowSelection || this.colSpecificHandlers){ 
     this.on('beforecellselect', function(selModel, rowIndex, columnIndex){ 
      //etcetera 

しかし、我々はCellSelectionModelをインスタンス化され、その上にbeforecellselectリスナーを指定:私は、コードの巨大な帯状を切り捨てていますが、これは一般的なアイデアを提供しなければならない

var sm = new Ext.grid.CellSelectionModel({ 
listeners: { 
    beforecellselect : { 
    fn: function(selModel, rowIndex, colIndex) { 
      //etcetera 

問題新しいCellSelectionModelインスタンスのリスナー内から、オーバーライドで定義されたリスナーも呼び出す必要があります。 ExtJSのは、同じ名前のイベントリスナーの配列を保持するように思われるので、以下のように、私は委任することができるよ:

selModel.events.beforecellselect.listeners[1].fn.apply(selModel, arguments); 

[OK]を、私は、コードインデックスをハードいけない知っています。しかしそれに加えて、これを行うにはより良い、より多くのExtJS-yの方法がありますか?あなたのケースでは

+0

リスナーが追加されます(リスナーはあなたが言及しているリスナー配列にあるため、置き換えられません)。元のリスナーを呼び出すために何もする必要はありません。イベントが発生すると、すべてのリスナーが呼び出されます。オーバーライドにはおそらく何か問題があると私は思います。 – pakman

答えて

1

あなたが知っていれば、それはコンストラクタの外で使用される機能になるだろうことは、 私は以下に示すように、CellSelectionModel インスタンスの方法として、イベントハンドラ関数を追加することをお勧め:

Ext.override(Ext.grid.CellSelectionModel, { 
     init:function() { 
      Ext.grid.CellSelectionModel.superclass.init.apply(this, arguments); 
      this.customBeforeCellSelect = function(selModel, rowIndex, colIndex) { 
       // etcetera 
      }; 
      if (this.unselectableColumns 
       || this.visuallyMimicRowSelection 
       || this.colSpecificHandlers) { 
       this.on('beforecellselect', this.customBeforeCellSelect, this); 
      } 
    }); 

    var sm = new Ext.grid.CellSelectionModel({ 
     listeners: { 
      beforecellselect : { 
       fn: function(selModel, rowIndex, colIndex) { 
        selModel.customBeforeCellSelect.apply(selModel, arguments); 
       }, 
       scope: sm 
      } 
     } 
    }); 

しかし、あなたがオーバーライドされたコンストラクタでbeforecellselectイベントにイベントハンドラをアタッチしていることに注意してください、あなたが特定のインスタンスlistenersにbeforecellselect中に再度このイベントハンドラ関数を呼び出す場合は、実行することになります同じ機能を2回続けて実行します。

効率性を考慮して、customBeforeCellSelectinitの個々のインスタンスに配置する代わりに、カスタムハンドラをプロトタイプExt.grid.CellSelectionModelに移動することができます。

Ext.grid.CellSelectionModel.prototype.customerBeforeCellSelect = 
     function(selModel, rowIndex, colIndex) { 
      // etcetera 
    }; 

あなたのoverride文の後に上記の行を追加します。これを可能にするために、以下を行います。

+0

私はそれが別のアプローチだと思っていましたが、それは間違いなく脆弱です。これは私の最初の半週間の契約でしたが、彼らは私が彼らのベースオーバーライドを変更するのを見る前にある程度の自信を持っていきたいと思います。誰か他の人が別の方法で答えるかどうかがわかりますが、そうでなければ私はあなたの答えを短い順序で受け入れるべきです。 –

+0

私は元の答えで効率を考慮するのを忘れました。私はそれを説明する答えを更新しました。追加は答えの一番下にあります。 :) – Ryan