2012-05-28 38 views
0

我面臨着什麼看起來像殭屍參考案例。事件保持綁定到殭屍實例

首先,這是我正在使用的代碼。

在這裏,你會發現我的用戶信息經理佈局gist

控制器,相反,可以發現here

操作的流程如下:

  1. 管理員訪問權限列表的用戶碰到控制器上的「管理用戶」的路由。
  2. 管理員單擊用戶行並觸發事件「users:selected」並且偵聽器接收用戶實例以使用。
  3. DetailsLayout得到實例化並在應用程序的主佈局中呈現。在其「內容」區域中具體爲 。
  4. 處理用戶詳細信息表單的視圖也被實例化,並在 DetailsLayout的「dettagli」區域內呈現。
  5. 此時,管理員有興趣管理此用戶的筆記。因此,他在標記爲「筆記」的標籤上點擊 ,筆記列表將在DetailsLayout「筆記」區域中呈現。
  6. 點擊管理員想要處理的筆記,觸發事件「筆記:已選中」,它將筆記實例傳遞給相應的事件處理程序(DetailsLayout.showNote)。

此時一旦管理員單擊一個觸發DetailsLayout.showUsers,進而觸發事件鏈接「用戶:指數」由上述提到的控制器聽了,他 回來到列表中的第1點以上。

直到第5點重複整個過程都如預期的那樣工作,但是,只要管理員 選擇了工作註釋,調試器就會顯示關於DetailsLayout區域「note」未定義的錯誤。

通過代碼步步運行我已發現,在第二次運行中燒製 正確綁定到DetailsLayout的適當實例除了其仍然結合於第一遍使用的實例的點6的事件。

上面的代碼顯示每次顯示用戶的詳細信息時都會創建一個新的DetailsLayout實例。難道這不足以保證沒有殭屍還在身邊嗎?如果我從backbone.marionette文檔中正確記得,每次layout.region.show()命中時,它會關閉前一個視圖(解除事件和所有其他事件)並附加新傳遞的視圖。

那是我做錯了什麼?

在此先感謝您的幫助。 Regards

P.S.

Backbone.marionette版本0.8.4

Backbonejs版本是0.9。2

+0

你能與問題發佈您的代碼內嵌? –

回答

2

你在UserDetailsList構造的問題是:

  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())) 

你直接綁定到Hub.vent但從來沒有顯式地從這些事件中解除綁定。因此,你的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也適用於Layout,包括使用bindToclose信息/文件的擴展等

+0

嗨德里克!再次感謝你的幫助。您在代碼中看到的Hub是Backbone.Marionette.Application的一個子類。我相信我必須審查事件pub/sub系統集中。 – CarmineM74