2011-08-13 127 views
41

我是新來Backbone.js,我試圖找出,其中狀態變量應該住。我用例:Backbone.js - 在哪裏存儲狀態信息?

我提供了一個閱讀界面爲一本書的應用程序(我知道,典型的例子,對吧?)。我的模型是BookPage與集合類爲每個。應用程序的結構看起來大致是這樣的(原諒ASCII的Visio):

+------------+ 
| Controller | 
+------------+ 
    |  Views     Models 
    | +--------------+  +----------------+ 
    |-| IndexView |------| BookCollection | 
    | +--------------+  +----------------+ 
    |        | 
    | +--------------+  +----------------+ 
    +-| BookView |------|  Book  | 
     +--------------+  +----------------+ 
     |       | 
     | +--------------+   | 
     |-| TitleView |-+   | 
     | +--------------+ | +----------------+ 
     |     +-|  Page  | 
     | +--------------+ | +----------------+ 
     +-| PageView |-+ 
     +--------------+ 

也就是說,Controller實例化和協調兩種觀點,IndexViewBookView,通過模型的支持。該BookView實例化和協調一組子視圖(實際上超過這裏顯示有)。

狀態信息包括:

  • 當前圖書(指針或ID)
  • 當前頁面(指針或ID)
  • 其他UI狀態變量,如是否在頁面上的圖像是可見是否其他小部件是開放還是關閉等

我的問題是,這個狀態信息應該在哪裏存在?可能的選項包括:

  • 模式,這可能是狀態感知。這有一定道理,因爲他們是用於存儲數據和觀點可以監聽狀態的變化,但它似乎並不像這符合預期Backbone.js的模式,並不會總是有意義的(例如,在打開的圖像PageView應該適用於所有頁面,而不僅僅是當前頁面)

  • A 特殊單體模型打算保存狀態信息。再次,有道理,容易聽,所有的觀點可以綁定它 - 但再次,這似乎超出標準的MVC。

  • 意見,誰負責的UI狀態 - 但是這需要意見,瞭解彼此的獲得狀態信息,這似乎不正確

  • 控制器,這應該航線國家之間的應用 - 這是有道理的,但它意味着一個稍微奇怪的往返,例如User selects "Show Images" --> View event listener is called --> View informs Controller --> Controller updates state --> Controller updates View(而不是簡單的User selects "Show Images" --> View event listener is called --> View updates

我想在某些方面,這是一個通用的MVC的問題,但我無法讓我的頭周圍。 應用程序的哪些部分應負責保存當前狀態?

UPDATE:以供將來參考,我用了一個全球性的單國模型這個問題。該UI流程是這樣的:

  1. 查看UI處理程序做什麼,但更新app.State
  2. 我的路由器也做什麼,但更新app.State - 他們展示及反應網址變更
  3. 意見基本上是專業的意見聽取app.State上的更改並相應更新

我的應用程序是開源的 - 您可以看到code on Github。這裏的相關部分是State model,我已經擴展了它以處理(de)序列化URL的狀態。

+0

骨幹中沒有'Controller' 0.5 – Raynos

+1

嗯,是的,我有一個我叫'Controller'的路由器類。它仍然基本上是爲了執行控制器的功能,對吧? – nrabinowitz

+1

不是真的。就經典MVC而言,您應該將'View'視爲一個經典的Controller。做骨幹時最好不要去嘗試和思考經典的MVC。根據你的問題,當前的書進入AppView,當前頁面進入Book,其餘的進入AppView。 'AppView'是一個**特殊的singleton視圖**如果你願意 – Raynos

回答

12

爲什麼不創建一個狀態模型來存儲和描述當前狀態?我不認爲這是錯的。由於當前狀態涉及多個模型,我認爲創建狀態模型來存儲和接收當前狀態是合理的。

然後控制器可以與狀態模型進行通信以獲得當前狀態。 UI狀態應該存儲在相應的模型中。狀態模型知道哪本書,哪個頁面,然後書和頁面模型跟蹤他們當前的UI狀態。

+0

這或多或少是我決定去的方式,但我完全放棄了控制器 - 視圖更新UI事件的狀態模型,然後偵聽狀態更新以更新UI,路由器也一樣網址。 – nrabinowitz

+0

很酷。我在一個rails應用程序中遇到了類似的問題。新模型解決了現有模型或控制器中不適合的功能,這些新模型也幫助應用程序保持「RESTful」。 – Ragnar

14

Don't limit your Backbone apps to Backbone constructs。如果您發現您的應用程序需要某些功能不適合Backbone的構造,請不要爲了保留Backbone中的所有內容而將其整合到一個功能中。

我發現這個backbone boilerplate在這方面很有幫助。它爲你設置模塊併爲你提供一個擴展Backbone.Events的應用程序對象(就像在之前鏈接的文章中一樣)。這個應用程序對象可以用來存儲實例化的模型,視圖和控制器/路由器,並且您應該可以隨意將自己的非主幹模塊添加到應用程序對象中,以處理不完全符合其中一個骨幹結構。

+0

感謝您的鏈接。這實際上並不是我所做的事情 - 例如,請參閱[我的應用程序初始化](https://github.com/nrabinowitz/gapvis/blob/master/app/app.js),這與鏈接相似。但Backbone *在事件和聽衆方面可以幫助一個狀態模型。你可以看到[我的實現在這裏](https://github.com/nrabinowitz/gapvis/blob/master/app/models/State.js)。 – nrabinowitz