Backbone.js Master-Detail场景

时间:2011-09-05 13:21:57

标签: backbone.js

我有一个经典的主 - 细节场景,我在backbone.js中实现。

目前我并不关心backbone.js的历史和导航部分,所以我正在跳过它。

  • 我有一个GridView,其中所有模型都从休息服务中获取并显示。
  • 我有一个DetailView(模态窗口),其中显示来自网格的特定选定模型,并在主网格视图中显示更多字段。

我已实施:

  • 主要应用程序,其中连接了所有主干视图和路由器。
  • 应用程序在已加载文档
  • 上初始化
  • 一个主要的Backbone路由器(更像是一个经典的“控制器”),负责:
    • 创建和销毁视图
    • 获取和发布数据
    • 将数据传递给视图
    • 协调观看事件

现在,从gridView(Backbone集合)的其余服务返回的数据只是模型的部分数据。

因此,要显示特定模型的完整详细信息,我必须从其余服务中再次获取详细信息。

从模型中取出一个与集合断开连接的模型,对它的任何更新都不会反映在集合本身上,我必须再次刷新主视图以获取所有数据。

销毁和重新创建详细信息视图有时会使视图事件失效。

这种情况的正确实施是什么? 我并不完全了解骨干做事的最佳方式。

1 个答案:

答案 0 :(得分:7)

首先,我建议在“gridView”集合查询中返回模型的完整详细信息。这解决了“断开连接的集合”问题。

虽然,你不必进行完整的集合加载 - 假设为整个集合进行完全加载是行不通的 - 细节太大了,例如,你应该能够通过它从集合模型到详细视图,测试它是否为部分加载或满载,并为模型发出“fetch()”,返回完整数据 - 这与集合中的模型相同,它应该更新。这有意义吗?

此外,对于详细视图,我建议,特别是如果您只设计调用一个详细视图活动,重用视图并在视图中编写一个允许您交换模型的函数。

所以,总结一下:

  • 在应用程序启动时,加载一个gridView和一个detailView。
  • 重构您的detailView以允许在其上设置模型。 (detailView.setModel(..)
  • 当用户想要查看模型的详细信息时,使用上述函数将该模型传递给detailView。
  • 如果模型没有完全加载,你的setModel方法可以去获取()其余的数据。您可以测试仅在满载时存在的特定属性,或者在模型上设置属性以指示其是否已完全加载。
  • 如果您发现自己丢失了事件,请尝试在render()函数结束时调用delegateEvents()重新绑定事件。
  • 由于gridView集合和detailView中都使用了相同的模型,假设您正确响应了更改事件,所有内容都应该同步。