骨干可以集合包含不同类的模型对象吗?

时间:2013-05-31 13:54:52

标签: backbone.js backbone-collections

我刚刚开始将backbone.js用于新的崩溃项目。我的应用程序有一个动态(数据驱动)用户菜单。每个菜单选项都是一组混合类型的图表/小表。例如,“销售概览”菜单选项可以包含一个包含2个饼图对象,2个折线图,条形图等的页面。我不知道菜单选项会是什么,也不知道每个菜单选项会带来什么。

我正在考虑通过扩展Backbone.Model - PieModel,BarModel,DispersionModel等来定义一堆通用模型“类”。以及可以渲染类型对象的相应View类--PieView,LineView等。然后,我可以按照动态配置的定义将这些组合在一起来组装页面。每个模型实例的数据URL都可以通过动态配置轻松生成。

我首先担心的是Backbone是否支持混合模型类型的集合。这是由于收藏品的“模型”属性的存在而引发的 - 它是否假设同质性?但它也说集合可以包含一组有序的模型....模型属性可以是多态的...一种获取集合中“模型”的方法。我应该将其视为“模型对象”吗?

对我而言,“页面”确实是这些对象的集合。我想在运行中创建一个Collection,并使用不同模型类型的实例填充它。然后通过View渲染。或者,使用各种模型对象的数组创建一个View并渲染View,同时绕过Collection。

我将非常感谢您对我所概述的设计的参考,以及对主干的良好参考,以及如何在混合模型案例中部署集合的清晰度?也许有一种不同的,更聪明的方式来处理这种情况......

感谢。

2 个答案:

答案 0 :(得分:2)

在将普通对象传递到其加法器函数(例如modeladd)时,集合仅真正使用其push属性。如果您查看the source,则每个加法器函数都会通过_prepareModel传递输入,该输入检查输入是否为Backbone.Model的实例。如果不是,它会尝试使用集合的model来实例化一个新模型,否则它只会返回未经改变的输入。

因此,只要您始终将真实的模型对象添加到集合中,您就可以使用不同的类型。

但是,如果您计划使用对模型属性起作用的聚合函数(例如pluck),那么当函数尝试获取不属于该属性的属性时,可能会遇到错误存在于一种模型中(虽然大多数时候我认为它会默默地失败,这可能是你想要的)。

答案 1 :(得分:1)

我不确定我是否100%正确理解您的情况,但是,我不相信您正在以正确的方式考虑这一点......

在我看来,您的模型应该包含数据,并且视图应该代表它们。因此,在销售环境中,您可能拥有SalesData模型,该模型可以显示在PieViewBarViewTableView中。尝试将显示逻辑与数据完全分开 - 在我看来,图表的类型属于显示逻辑。

通过上述方法,每个页面将包含一组不同的视图,如果您觉得有必要,可以在主视图中包含这些视图。每个视图都有自己的模型(或集合取决于您如何构建数据),然后您可以使用常规的Backbone方法更新/操作。

据我所知,集合中不可能包含不同类型的模型,但即使是这样,我也可能不推荐它,因为它会使代码复杂化。

在学习资源方面,以下是一对:

Learn Backbone JS compeltely -- javascriptissexy.com - 这个非常彻底,但需要一些时间才能完成。

Backbone patterns - 更快地让你处于正确的思维状态。