我是Backbone.js的新手,我正试图找出状态变量应该存在的地方。我的用例:
我有一个为书提供阅读界面的应用程序(我知道,经典的例子,对吧?)。我的模型是Book
和Page
,每个模型都有集合类。应用程序的结构看起来大致如此(原谅ASCII visio):
+------------+
| Controller |
+------------+
| Views Models
| +--------------+ +----------------+
|-| IndexView |------| BookCollection |
| +--------------+ +----------------+
| |
| +--------------+ +----------------+
+-| BookView |------| Book |
+--------------+ +----------------+
| |
| +--------------+ |
|-| TitleView |-+ |
| +--------------+ | +----------------+
| +-| Page |
| +--------------+ | +----------------+
+-| PageView |-+
+--------------+
也就是说,Controller
实例化并协调两个视图,IndexView
和BookView
,由模型支持。 BookView
实例化并协调一组子视图(实际上这里显示的内容不止这些)。
国家信息包括:
我的问题是,这个州的信息应该在哪里生活?可能的选项包括:
模型,可以是状态感知的。这是有道理的,因为它们旨在存储数据和视图可以监听状态更改,但它似乎不符合预期的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流程如下:
app.State
app.State
之外什么都不做 - 它们本质上是专门的视图,可以显示和响应URL更改app.State
上的更改并相应更新我的应用是开源的 - 您可以看到code on Github。这里的相关部分是State model,我已经扩展到处理(de)序列化URL的状态。
答案 0 :(得分:14)
Don't limit your Backbone apps to Backbone constructs。如果你发现你的应用程序需要一些不太适合Backbone的一个构造的功能,那么不要仅仅为了保留Backbone中的所有内容而将其整合到一个中。
我发现这个backbone boilerplate在这方面很有帮助。它为您设置模块,并为您提供扩展Backbone.Events的应用程序对象(如之前链接的文章中所述)。此app对象可用于存储实例化的模型,视图和控制器/路由器,您可以随意将自己的非主干模块添加到app对象,以处理不完全适合其中一个的责任。骨干构造。
答案 1 :(得分:12)
为什么不创建状态模型来存储和描述当前状态?我不认为那是错的。由于当前状态涉及多个模型,我认为创建状态模型来存储和接收当前状态是合理的。
然后,控制器可以与状态模型通信以获得当前状态。 UI状态应该存储在相应的模型中。状态模型知道哪本书和哪个页面,然后书籍和页面模型跟踪他们当前的UI状态。