2011-08-13 130 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