Backbone.js – 在哪里存储状态信息?

我是Backbone.js的新手,我试图找出状态variables应该存在的地方 。 我的用例:

我有一个应用程序,提供了一本书的阅读界面(我知道,经典的例子,对吧?)。 我的模型是BookPage与集合类为每个。 应用程序的结构大致如下(原谅ASCII的Visio):

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

也就是说, Controller实例化并协调两个视图,即模型支持的IndexViewBookViewBookView实例化和协调一组子视图(这里实际上比这里显示的要多)。

国家信息包括:

  • 当前的书(指针或ID)
  • 当前页面(指针或ID)
  • 其他UI状态variables,例如页面上的图像是否可见,其他小部件是否打开或closures等等。

我的问题是,这个国家信息在哪里存在? 可能的选项包括:

  • 模型 ,这可能是国家意识。 这是有道理的,因为它们是用来存储数据的,视图可以监听状态的变化,但是它看起来并不符合预期的Backbone.js模式,并不总是有意义的(例如, PageView应该适用于所有页面,而不仅仅是当前页面)

  • 旨在保存状态信息的特殊单例模型 。 再次,有意义,容易听,所有的意见可以绑定到它 – 但是,这似乎超出了标准的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问题,但是我很难解决这个问题。 应用程序的哪一部分应该负责保存当前状态?

更新:为了将来的参考,我使用了一个全局的单态模型来解决这个问题。 UIstream程如下所示:

  1. 查看UI处理程序app.State更新app.State
  2. 我的路由器也什么都不做,只是更新app.State – 他们本质上是专门的视图,显示和反应URL的变化
  3. 视图监听app.State上的app.State并相应地更新

我的应用程序是开源的 – 你可以在Github上看到代码 。 这里的相关部分是状态模型 ,我已经扩展了处理(de)序列化URL的状态。

为什么不创build一个状态模型来存储和描述当前的状态? 我不认为这是错的。 由于当前状态涉及多个模型,我认为创build状态模型来存储和接收当前状态是合理的。

控制器然后可以与状态模型进行通信以获得当前状态。 UI状态应该存储在相应的模型中。 状态模型知道哪本书和哪个页面,然后书和页面模型跟踪他们当前的UI状态。

不要限制你的骨干应用程序到骨干结构 。 如果你发现你的应用程序需要一些不适合Backbone的构造的function,那么不要为了保留Backbone中的所有东西而把它变成一个function。

我发现这个骨干样板在这方面是有帮助的。 它为你设置模块,并为你提供一个扩展Backbone.Events的应用程序对象(就像在之前链接的文章中一样)。 这个应用程序对象可以用来存储实例化的模型,视图和控制器/路由器,你应该可以自由地将自己的非主干模块添加到应用程序对象中,以处理不完全符合其中一个骨干结构。