8

メインコントローラーがあり、アプリケーションには「モジュール」ごとにコントローラーがあるとします。このメイン コントローラーには、ビューポート、ヘッダー (メニュー付き)、および最初は空である "中央揃え" コンテナーが含まれます。

メニューをクリックすると、現在のモジュール/コントローラーが変更され、(このコントローラーに属する) アドホック ビューが中央のコンテナーに表示されます。

非常に単純なシナリオだと思いますが、奇妙なことに、適切な方法が見つかりませんでした。何か案は?どうもありがとう!

4

2 に答える 2

9

ここに私がしていることがあります: 私は上にツールバーがあり、左側のナビゲーションがあり、中央の場所は作業領域 (基本的にはタブパネル) です。アプリケーションの各部分を取り上げて説明しましょう。まず、ビューポートがどのように見えるかを次に示します。

Ext.define('App.view.Viewport',{
    extend: 'Ext.container.Viewport', 
    layout: 'border',
    requires: [
        'App.view.menu.NavigationPane',
        'App.view.CenterPane',          
        'App.view.menu.Toolbar'
    ], 
    initComponent: function() {
        Ext.apply(this, {
            items: [{
                region: 'north',
                xtype: 'panel',                 
                height: 24,                                     
                tbar: Ext.create('App.view.menu.Toolbar')                                       
            },{
                title: 'Navigation Pane',
                region: 'west',
                width: 200,
                layout: 'fit',
                collapsible: true, 
                collapsed: true,
                items: Ext.create('App.view.menu.NavigationPane')                                       
            },{
                region: 'center',                                               
                xtype: 'centerpane'                                     
            }]       
         });

        this.callParent(arguments);
     }
});

メニューと左側のナビゲーション (App.view.menu.NavigationPane) を備えたツールバー (App.view.menu.Toolbar) があることがわかります。これら 2 つのコンポーネントは、メイン メニューまたは他のモジュールへのゲートウェイを構成します。ユーザーがメニュー項目を選択すると、適切なモジュール ビュー (フォーム、グリッド、グラフなど) が「センターペイン」に読み込まれます。センターペインは、Ext.tab.Panel の派生クラスに他なりません。

あなたが言ったように、ツールバーとナビゲーション ペインからのすべての要求を処理するメイン コントローラーがあります。ツールバーとナビゲーション ペインのクリック アクションのみを処理しました。これが私のAppControllerです:

Ext.define('CRM.controller.AppController',{
    extend: 'Ext.app.Controller',    
    init: function() {

        this.control({   

            'apptoolbar button[action="actionA"]' : {
                     click : function(butt,evt) {
                             this.application.getController('Controller1').displayList();
                     }
             },  
             .
             .  // Add all your toolbar actions & navigation pane's actions...
             .           
             'apptoolbar button[action="actionB"]' : {
                     click : function(butt,evt) {
                            this.application.getController('Controller2').NewRequest(); 
                     }
             }
        });     
     } 
 });

ボタンのハンドラーの 1 つを見てください。「アプリケーション」プロパティを介してコントローラーを取得します。

this.application.getController('Controller2').NewRequest(); 

getController メソッドを使用して、コントローラーのインスタンスを取得し、コントローラー内の任意のメソッドを呼び出します。次に、モジュールのコントローラーのスケルトンを見てみましょう。

Ext.define('CRM.controller.Controller2',{
    extend: 'Ext.app.Controller',    
    refs: [         
        {ref:'cp',selector: 'centerpane'}, // reference to the center pane
        // other references for the controller
    ],
    views: ['c2.CreateForm','c2.EditForm','c2.SearchForm','c2.SearchForm'],
    init: function() {

        this.control({   

            'newform button[action="save"]' : {
                // Do save action for new item
            },  
            'editform button[action="save"]' : {
                // update the record...
            },  
            'c2gridx click' : {
                // oh! an item was click in grid view
             }
        });     
    },
    NewRequest: function() {
        var view = Ext.widget('newform');
        var cp = this.getCp();      // Get hold of the center pane... 
        cp.add(view);   
        cp.setActiveTab(view);
    },
    displayList: function() {
        // Create grid view and display...
    }   
 });

私のモジュールのコントローラーには、そのモジュールに関連するアクション (モジュールのグリッド、フォームなど) しかありません。これは、正しい方向に転がり始めるのに役立つはずです。

于 2011-10-04T10:41:30.817 に答える
1

メインコントローラーで、メニューのクリックイベントハンドラーに子コントローラーを追加します

Ext.define('MyAPP.controller.MainController',{
...
  init:function()
  {
    this.control({
     'menulink':
     {
        click:this.populateCenterPanel
     }
    });
  },
  populateCenterPanel:function()
  {
    this.getController('ChildController');
  }
});

起動関数で、リスナーをコントローラーに追加し、次のようにイベントを追加します-

Ext.application({
...
  launch:function(){
    this.controllers.addListener('add',this.newControllerAdded,this);
  },

  newControllerAdded:function(idx, ctrlr, token){
    ctrlr.init();
  }
});

次に、ChildController の init メソッドでビューポートにビューを動的に埋め込むためのコードを配置します。

Ext.define('MyAPP.controller.ChildController',{
...
  refs: [
    {ref:'displayPanel',selector:'panel[itemId=EmbedHere]'}
  ]
  init:function(){
    var panel=this.getDisplayPanel();
    panel.removeAll();
    panel.add({
      xtype:'mycustomview',
      flex:1,
      autoHeight:true,
      ...
    });
  }
});

HTH :)

于 2011-10-04T14:41:28.647 に答える