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

23 浏览
0 Comments

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

我对Backbone.js还很陌生,正在尝试弄清楚“状态变量应该存放在哪里”。我的用例是:我有一个为书籍提供阅读界面的应用程序(是的,经典例子,对吧?)。我的模型是Book和Page,每个都有相应的集合类。应用程序的结构大致如下(请原谅这个ASCII图):

+------------+

| 控制器 |

+------------+

| 视图 模型

| +--------------+ +----------------+

|-| IndexView |------| BookCollection |

| +--------------+ +----------------+

| |

| +--------------+ +----------------+

+-| BookView |------| Book |

+--------------+ +----------------+

| |

| +--------------+ |

|-| TitleView |-+ |

| +--------------+ | +----------------+

| +-| Page |

| +--------------+ | +----------------+

+-| PageView |-+

+--------------+

也就是说,控制器实例化和协调两个视图,IndexView和BookView,并由模型支持。BookView实例化和协调一组子视图(实际上比这里显示的更多)。

状态信息包括:

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

我的问题是,这些状态信息应该放在哪里?可能的选项包括:

  • 模型,它们可以具有状态感知功能。这看起来有些合理,因为它们旨在存储数据,视图可以监听状态变化,但似乎不符合预期的Backbone.js模式,并且并不总是有意义(例如,在PageView中打开图像应该适用于所有页面,而不仅仅是当前页面)
  • 一个特殊的单例模型,用于保存状态信息。同样,这是有意义的,易于监听,所有视图都可以绑定到它 - 但这似乎超出了标准MVC的范畴。
  • 视图,它们负责UI状态 - 但这将要求视图知道彼此以获取状态信息,这似乎是不正确的
  • 控制器,它应该在状态之间路由应用程序 - 这是有意义的,但它意味着稍微奇怪的往返,例如“用户选择“显示图像”--> 视图事件侦听器被调用--> 视图通知控制器--> 控制器更新状态--> 控制器更新视图”(而不是更简单的“用户选择“显示图像”--> 视图事件侦听器被调用--> 视图更新”)

我想这在某种程度上是一个通用的MVC问题,但我对此还是有些困惑。应用程序的哪个部分应负责保存当前状态?

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

  1. 视图UI处理程序只更新app.State
  2. 我的路由器也只更新app.State - 它们本质上是显示和响应URL更改的专用视图
  3. 视图监听app.State的更改并相应地进行更新

我的应用程序是开源的 - 您可以在Github上查看代码。这里的相关部分是State模型,我已经扩展了它来处理URL的(反)序列化状态。

0