2012-03-09 7 views
11

私はDRYに従うために他のアイテムが継承するいくつかの "ベース"アイテム(ベースフォーム、ベースグリッドなど)を持つかなり複雑なアプリケーションを書くつもりです。これらの基本項目は共通のイベントを持ち、継承するすべての項目が起動します。これが当てはまるので、私は、これらのアイテムのイベントを待ち受ける何らかの種類のベースコントローラが必要になります。ExtJS 4でコントローラの継承を実行するには?

コントローラを簡単に継承/拡張するための基本的な方法は何ですか?

答えて

11

これは私たちのプロジェクトでやっていることです。

BaseGrid:ここではグリッド/コントローラのコンボのためのカップルのサンプルがある

Ext.define('BaseGrid', { 
    extend: 'Ext.grid.Panel', 

    initComponent: function() { 
    var me = this; 
    // create common stuff 

    me.on('itemcontextmenu', me.showContextMenu, me); 
    me.callParent(arguments); 
    }, 

    showContextMenu: function(view, rec, node, index, e) { 
    var me = this; 

    if (me.contextMenu === undefined) 
     return; 

    e.stopEvent(); 
    me.contextMenu.showAt(e.getXY()); 
    } 

}); 

BaseController:

Ext.define('BaseController', { 
    extend: 'Ext.app.Controller', 

    init: function() { 
     // put some common stuff 


     this.callParent(arguments); 
    }, 

    gridRendered: function() { 
    // common function to do after grid rendered 
     var me = this, 
      grid = me.getGrid(); // note that base controller doesn't have ref for Grid but we still using it !! 

     gr.contextMenu = me.createContextMenu(); 
    }, 

    createContextMenu: function() { 
     return ... // create context menu common for all grids with common handlers 
    }, 

}); 

ChildGrid:

Ext.define('ChildGrid', { 
    extend: 'BaseGrid', 
    alias: 'widget.child' 
... 

}); 

ChildController:

Ext.define('ChildController', { 
    extend: 'BaseController', 

    refs: [ 
    { ref: 'grid', selector: 'child gridpanel' } // now basecontroller will have something when called getGrid()!! 
    ], 

    init: function() { 
    var me = this; 
    me.control({ 
     'child gridpanel': { 
      afterrender: me.gridRendered, // subscribing to the event - but using method defined in BaseController 
      scope: me 
     } 
    }); 

    me.callParent(arguments); 

    }, 
}); 

これらのカップルサンプルが役立つことを願っています。基本的な考え方は、これらは以下のとおりです。

  • あなたがすることを忘れないでくださいあなたがベースのコントローラ
  • でレフリー機能(getGrid()など)を使用 コントローラ
  • ベースのコントロールとベースに、できるだけ多くのコードを入れてすべての子コントローラでこれらの参照を作成する
  • 子コントローラ内の基本コントローラハンドラに複数のキーイベントをリンクする。
+0

コードを共有していただきありがとうございます。 – dbrin

関連する問題