2011-11-15 7 views
2

ExtJS4の新しいMVCパターンに従ってダイナミックコントローラを作成していて、小さな問題が発生しました。私はthis.controlメソッドを使用して、コントローラを自分のビューにアタッチしました。コントローラーを2回目に作成するとき(ナビゲーションで前後に移動する)、私はそれらを数回付けました。私の質問です:コントローラを破壊するか、またはthis.controlコマンドで設定したすべてのリスナーを削除する最良の方法は何ですか。ExtJS MVC:ダイナミックコントローラからハンドラを削除する方法

事前 のおかげでクリス


私の新しいコントローラのコードのような次のようになります。init関数内で

var step1Controller = Ext.create("MyApp.controller.Step1Controller", { 
    application : this.application 
}); 
step1Controller.init(); 

私はこのような新しいコントローラを作成します私のコントローラの私はこのようなビューにコントローラを接続しました:

init : function() { 
    this.addEvents(['step1completed','basecontructionaborted']); 
    this.setupScreenLayout(); 
    this.getTmpConfiguredControlModelsStore().removeAll(); 
    this.application.fireEvent("addBreadCrumb", "Inbetriebnahme"); 
    this.application.fireEvent("addBreadCrumb", "Schritt 1/3"); 

    this.control({ 
     '#addmodelbutton' : { 
      click : this.onAddBtnClick 
     }, 
     '#modelviewer' : { 
      modelselected : this.onPanelSelect 
     }, 
     '#navigationcontainer #movemodelleftbutton' : { 
      click : this.onMoveModelLeftClick 
     }, 
     '#navigationcontainer #continuestep2' : { 
      click : this.onContinueStep2Click 
     }, 
     '#navigationcontainer #abortbutton' : { 
      click : this.onAbortButtonClick 
     } 
    }); 

    console.log('[BaseConstruction | init] completed'); 
} 
+0

Ext.app.EventBusを参照してください。 – atian25

+0

ビューを破棄する場合、EventBusはリスナーを自動的に削除する必要があります。 – VoidMain

+0

皆さんありがとう、このようなイベントを聞くのではなく、EventBusを使うべきですか? – Chris

答えて

1

古い質問ですが、これを解決して半日を殺しましたので、どのように回って回ったのか投稿します。この質問は自分の問題と非常によく似ています。他の人には便利だと思います。

私はコントローラー/ビューを動的にロードしています。すべてのリスナーは、コントローラーのinit()内のapp.controlを介して接続されています。何度もビューを破壊/初期化するまでは正常に動作しました。リスナーはview.destroy()の後のビューに残っていたので、後でそれらを初期化すると、そのリスナー(レンダリング、クリックなど)が2回発生しました。

これは私のためにそれを解く: 'beforerender' 末端に結合だと:

app.control({ 
     'element': { 
      beforerender: { 
       fn: function(thing){ 
        // beforerender stuff for thing 

        thing.on('select', function(this, record, item, index){ 
         console.log('select fired'); 
        }); 
       }, 
       single: true 
      }, 
     } 
    }); 

は、 "真のシングルを" 注意してください。それは重要な部分です。以前は 'beforerender'のように書かれていた他のリスナーはすべて.on()でその内部に移動されました。

乾杯!

関連する問題