2011-11-15 1 views
2

ExtJS4의 새로운 MVC 패턴에 따라 동적 컨트롤러를 만들고 작은 문제가 발생했습니다. this.control 메서드를 사용하여 컨트롤러를 내 뷰에 연결했습니다. 컨트롤러를 두 번째로 만들 때 (내 탐색에서 앞뒤로 움직이는), 나는 두 번 연결했습니다. 내 질문은 : 컨트롤러를 파괴하거나 this.control 명령을 통해 설정 한 모든 리스너를 제거하는 가장 좋은 방법은 무엇입니까? init 함수에ExtJS MVC : 동적 컨트롤러에서 핸들러를 제거하는 방법

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() 이후의 뷰에 남아 있었으므로 나중에 도로를 초기화하면 해당 리스너 (예 : 렌더링, 클릭 등)가 두 번 발생했습니다.

나를 위해 그것을 해결 :

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'에 연결된 사용자들은 "하나의 사실을." 그것이 중요한 부분입니다. 이전에 'beforerender'와 같이 쓰여진 다른 모든 청취자는 .on()으로 내부로 이동되었습니다.

건배!