由于 Backbone.js 本身不是一个框架,因此没有单一的“正确”方法可以做任何事情。但是,实现中有一些提示可以帮助您理解这个想法。此外,您还可以应用一些经过时间考验的通用代码组织实践。但我会先解释一下观点。
观看次数
Backbone 中的视图与特定的 DOM 元素相关联(这就是 el 属性的用途)。
如果在初始化视图时,它有一个el 属性,那么 Backbone.js 会将它作为新视图实例的属性。否则,它会查找tagName、id 和className 属性,创建相应的DOM 对象,并将其分配给新视图实例的el 属性。 (在the source中有解释。)如果连tagName都没有,则默认创建<div>元素。
所以,您可以猜到为什么TodoView 和AppView 使用不同的方法。 #todoapp 元素最初存在于 HTML 的页面中,因此 AppView 可以直接使用它。但是当一个待办事项的视图被创建时,它还没有 DOM 元素;因此开发人员在类上定义了tagName,以便 Backbone 自动创建列表项。 (在initialize() 方法中手动操作并不难,但Backbone 会为您节省一些时间。)
通常,视图属于以下两类之一:模型实例视图和集合视图。 Backbone 不会强制它,但它建议这可能是您想要的:如果您使用collection 或model 选项实例化视图,它们将成为新创建的视图实例,因此您可以通过view.collection 或view.model 访问它们。 (例如,如果您使用foo 选项实例化视图,它将被放入view.options.foo。)
依赖关系
良好做法
这只是我的意见。
MVC | Backbone.js |它能做什么
控制器 |查看(大部分)|处理用户交互
查看 |视图渲染的模板 |显示数据
型号 |模型与收藏 |表示数据,处理数据访问
-
模型层通常不应该依赖任何东西。在 MVC 中,模型是您访问数据的地方。这与数据的呈现方式无关。
在 Backbone 中,模型可以是某个集合的一部分,但这并不是一个严重的依赖项(AFAIK,它只是有助于自动找出与该模型对应的 API 端点的 URL。)
在 Backbone 中,一个集合可能会分配一个相应的模型类,但这也不是必需的。
在 Backbone 中,路由器通常依赖于更高级别的视图(例如整个页面或页面部分的视图)来呈现它们以响应应用程序状态的变化。反过来,这些视图依赖于一些较低级别的视图,例如小部件/页面部分。这些视图可以依赖于集合和其他更底层的视图。这些反过来又取决于特定的模型实例。
例如(箭头表示“取决于”关系类型):
+-------------+ +----------------+ +------------+
状态 |MainRouter |数据: |ItemCollection | |产品型号 |
控制:|--------------| |---------------| |------------|
| | |/api/items +-->|/api/items/*|
| | | | | |
| | | | | |
+---+-+-------+ +----------------+ +------------+
| +----------------+ ^ ^
v v | |
+-------------+ +-------------+ | |
页面级 |AboutView | |应用查看 | | |
浏览量:|-------------| |--------------| | |
|部分 | |部分 | | |
|角色="主要" | |角色="主要" | | |
+--+-+--------+ +--+-+-+------+ | |
| +---------------|-|-|----+ | |
| +----------+ | +----|---------+ | |
v v v v v | |
+--------------+ +--------------+ +---+------------+ |
小部件 |侧边栏视图 | |页眉视图 | |项目列表视图 | |
浏览量:|--------------| |---------------| |---------------| |
|一边| |标题 | | ul | |
| | | | | | |
| | | | | | |
+--------------+ +--------------+ +------------+---+ |
| |
v |
+--------+---+
|ItemAsLiView|
|------------|
|李 |
| |
+------------+
请注意,您可以设置多个路由器,在这种情况下,情况可能会有所不同。
todos.js
在 Todos 示例中,开发人员决定 Todo 模型实例应该依赖于相应的 TodoView 实例。当TodoView 被实例化时,它会在相应的模型实例上创建一个属性view 并将自己分配给它。以便some_todo_model.view 可以访问它。不过需要注意的是,model.view 只使用一次——在Todo 模型的clear() 方法中,用于在模型被清除时移除视图实例。
我认为 特定的依赖是不必要的。但是,对于这么小的应用程序,它可能还可以。
我在视图中找不到任何访问this.model.view 的示例,因此无法对此发表评论。
另见