2012-05-28 8 views
0

좀비 레퍼런스 케이스처럼 보입니다.이벤트는 좀비 인스턴스에 묶여 있습니다.

우선이 코드는 내가 사용하고있는 코드입니다.

  1. 관리자 액세스 목록 : 당신이 gist

    컨트롤러 내 사용자의 세부 정보 관리자 레이아웃을 찾을 수 있습니다 여기에

    는 대신,

    here을 찾을 수 있습니다

    작업의 흐름은 다음과 같다 컨트롤러의 "manageUsers"를 호출하는 경로에 도달 할 때의 사용자 수를 나타냅니다.

  2. 사용자 행에 대한 관리자 클릭 및 "users : selected"이벤트가 트리거되고 수신기는 작업 할 사용자 인스턴스를 수신합니다.
  3. DetailsLayout은 응용 프로그램의 기본 레이아웃에서 인스턴스화되고 렌더링됩니다. "콘텐츠"영역에 특히
  4. 사용자 세부 정보 폼을 처리하는 뷰도 인스턴스화되어 내부에 렌더링됩니다. DetailsLayout의 "dettagli"영역.
  5. 이 시점에서 관리자는이 사용자의 메모 관리에 관심이 있습니다. 그래서 그는 "notes"탭에있는 을 클릭하고 DetailsLayout "note"영역에서 음표 목록을 렌더링합니다.
  6. 관리자가 작업하려는 메모를 클릭하면 메모 인스턴스를 적절한 이벤트 처리기 (DetailsLayout.showNote)로 전달하는 이벤트 "메모 : 선택됨"이 발생합니다. "사용자 : 인덱스"관리자가 차례로 이벤트를 발생, DetailsLayout.showUsers를 발생 링크를 클릭하면이 시점에서

도 앞서 언급 한 컨트롤러에 의해 듣고, 그는 목록의 포인트 1로 돌아 오기 위.

포인트 5까지 전체 프로세스를 반복하지만, 관리자가 메모를 선택하자마자 디버거에서 DetailsLayout 영역 "메모"가 정의되지 않음에 대한 오류가 표시됩니다.

코드를 단계별로 실행하면 두 번째 실행시 실행 된 이벤트가 은 처음 패스에서 사용 된 인스턴스에 여전히 바인딩 된 점 6을 제외하고 DetailsLayout의 적절한 인스턴스에 올바르게 바인딩된다는 것을 알 수 있습니다.

위 코드는 사용자의 세부 정보가 표시 될 때마다 DetailsLayout의 새 인스턴스가 만들어지는 것을 보여줍니다. 아직 좀비가없는 것을 보장하기에 충분하지 않아야합니까? backbone.marionette 문서에서 올바르게 리콜하면 layout.region.show()가 실행될 때마다 이전 뷰 (이벤트와 나머지 모든 것의 바인드 해제)가 닫히고 새로 passwed 뷰가 첨부됩니다.

내가 잘못하고있는 것은 무엇입니까?

미리 도움을 주셔서 감사합니다. 감사합니다.

P.S.

Backbone.marionette 버전은 0.8.4

Backbonejs 버전은 0.9입니다.당신은 직접 Hub.vent에 결합하고

  constructor: (@user) -> 
       console.addHistory("DetailsLayout","INIT") 
       super() 
       Hub.vent.on("notes:selected",(note) => @showNote(note)) 
       Hub.vent.on("notes:show", => @showNotes()) 
       Hub.vent.on("notes:save", (note) => @saveNote(note)) 
       Hub.vent.on("notes:delete", (note) => @deleteNote(note)) 
       Hub.vent.on("notes:new", => @showNote(new Note())) 

하지만이 사건에서 결코 명시 적으로 바인딩 해제 다음 UserDetailsList 2

+0

당신은 질문 코드 인라인을 게시 할 수 ? –

답변

2

귀하의 생성자는 문제입니다. 따라서 UserDetails 목록의 인스턴스가 메모리에 영구히 보관됩니다.

이 문제를 해결하려면 레이아웃의 bindTo 메서드를 사용해야합니다.이 메서드는 바인딩을 추적하고 레이아웃의 close 메서드가 호출 될 때 바인딩 해제합니다.

  constructor: (@user) -> 
       console.addHistory("DetailsLayout","INIT") 
       super() 
       @bindTo(Hub.vent, "notes:selected",(note) => @showNote(note)) 
       @bindTo(Hub.vent, "notes:show", => @showNotes()) 
       @bindTo(Hub.vent, "notes:save", (note) => @saveNote(note)) 
       @bindTo(Hub.vent, "notes:delete", (note) => @deleteNote(note)) 
       @bindTo(Hub.vent, "notes:new", => @showNote(new Note())) 

더 이상 필요하지 않을 때 레이아웃을 올바르게 닫아야합니다. 레이아웃 인스턴스에서 close 메서드를 호출하십시오. 이렇게하면 생성자가 설정 한 모든 bindTo 이벤트가 올바르게 정리됩니다. 참고로

- Layout 그렇게 ItemView ItemView 또한 bindTo, close의 사용을 포함하여 Layout 적용에 대한 정보/모든 문서에서 직접 확장 등

+0

안녕 Derick! 도와 줘서 고마워. 코드에서 볼 수있는 허브는 Backbone.Marionette.Application의 하위 클래스입니다. 나는 pub/sub 시스템 중앙 집중식 이벤트를 검토해야한다고 생각합니다. – CarmineM74