Backbone.js - 存储状态信息的位置?

时间:2011-08-13 20:17:28

标签: javascript model-view-controller 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应该适用于所有页面,而不仅仅是当前页面

  • 用于保存状态信息的特殊单例模型。同样,有意义,易于倾听,所有观点都可以绑定到它 - 但同样,这似乎超出了标准的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问题,但我无法理解它。 应用程序的哪个部分应该负责保存当前状态?

更新:为了将来参考,我使用全局单例状态模型来解决此问题。 UI流程如下:

  1. 查看UI处理程序只会更新app.State
  2. 我的路由器除了更新app.State之外什么都不做 - 它们本质上是专门的视图,可以显示和响应URL更改
  3. 观看收听app.State上的更改并相应更新
  4. 我的应用是开源的 - 您可以看到code on Github。这里的相关部分是State model,我已经扩展到处理(de)序列化URL的状态。

2 个答案:

答案 0 :(得分:14)

Don't limit your Backbone apps to Backbone constructs。如果你发现你的应用程序需要一些不太适合Backbone的一个构造的功能,那么不要仅仅为了保留Backbone中的所有内容而将其整合到一个中。

我发现这个backbone boilerplate在这方面很有帮助。它为您设置模块,并为您提供扩展Backbone.Events的应用程序对象(如之前链接的文章中所述)。此app对象可用于存储实例化的模型,视图和控制器/路由器,您可以随意将自己的非主干模块添加到app对象,以处理不完全适合其中一个的责任。骨干构造。

答案 1 :(得分:12)

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

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