2011-09-20 28 views
32

我正在研究包含條目列表的Backbone應用程序,很像示例應用程序Todos(http://documentcloud.github.com/backbone/examples/todos/index.html)。Backbone.js:視圖之間的通信

所以,我有一個應用程序視圖和每個列表項的一個視圖。現在,假設我有一個全局編輯按鈕。應用程序視圖將處理點擊,然後我想要做的是告訴每個列表視圖顯示一個刪除按鈕。

在下面的屏幕截圖(來自Spotify)中,按下Edit按鈕會導致所有列表視圖改變外觀。

什麼是最好的方式與骨幹做到這一點。我需要迭代所有列表視圖並調用editMode函數。但應用程序視圖(開箱即用)不知道的列表視圖..

enter image description here

+3

我來這裏問這個完全相同的問題,碰巧在我的首頁上看到你的......怪異的。 –

回答

41

我寫了一篇文章在幾個不同的選項,而回視圖之間的協調:http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/

你的情況,我建議使用我在那篇文章中描述的事件聚合器。你可以讓每個項目視圖監聽一個「editmode」事件,或類似的東西。當這個事件觸發時,每個聽取它的視圖都會自行更新以進入編輯模式。那麼當你點擊「完成」時,你會做相反的事情 - 發送一個「viewmode」事件或類似的東西,並讓每個視圖適當地更新自己。

+1

假設對於問題中的示例,每個軌道的視圖都有對軌道集合的引用。直接或通過支持每個軌道視圖的軌道模型的屬性。通過這個集合發送'editmode'事件會不對?這樣你就不需要一個單獨的事件對象來實現這一點。 –

+1

「錯」是非常主觀的。它取決於應用程序中涉及的複雜性,以及解耦您的應用程序需要走多遠。您可以先將其傳入收藏集,然後查看它是否適合您。如果你開始看到所有的東西都緊密耦合,那麼重新組合使用一個單獨的事件對象。 –

+0

@DickickBailey - 非常喜歡你在文章中描述的模式。感謝分享。 – UpTheCreek

2

我的兩分錢:有一個簡單的「黑客」,你可以用Backbone.js的做實際上有一個的pub/sub,可以在視圖之間進行通信:

沿着這些東西線(未經測試):

var EventBus = Backbone.Model.extend({ 

    publish: function(event, args){ 

     this.trigger(event, args); 

    }, 

    subscribe: function(event, args) { 

     this.bind(event, args); 

    } 
}); 

你基本上明白了。現在對於每一個視圖,讓它與這個EventBus「綁定」(因爲視圖只能綁定到主幹中的模型/集合) - 你基本上只是使用方法名稱publish/subscribe與這樣一個模型的命名同步,但是你可能會選擇不。只需在這種情況下創建一個空的EventBus'類',並讓每個視圖都綁定到它:)

因此,每個視圖只需要耦合到此EventBus並對收到的事件起作用! Backbone.js在內部處理所有這種設計模式的管道,所以你幾乎可以免費獲得它:)

上述代碼可能不會按原樣運行,但有沒有給你一個想法呢...

+1

已經有Backbone.Events,爲什麼不把事情幹掉? – opengrid

+0

@opengrid - 這是爲v0.5.1。當它「如何使用事件」不如廣告:) – PhD

+1

說,「你基本上得到的想法」,而不是明確解釋你的意思是不是很有用,可能會更有挫敗感,而不是有益於人試圖找到答案。 – Pea

相關問題