在Backbone中使用嵌套对象数组创建集合?

时间:2015-08-30 10:28:50

标签: backbone.js

我想知道是否可以在我的模型数据中从嵌套集合中创建一个集合,我的模型包含一个名为agents的对象数组,而不是直接将新代理推送到模型数组中喜欢将这些作为自己的收藏处理,这可能吗?就像我创建一个集合,然后使用初始化来深入this.model.get('agents')或者我将它传递到新集合中?

模型数据

{
  "id": 1,
  "name: "Greenwich",
  "location": "UK",
  "city": "London",
  "agents": [
    {
     "id": 3,
     "name": "James Coy"
    },
    {
      "id": 56,
      "name": "Steven Pajak"
    },
    {
      "id": 32,
      "name": "Terry Collins"
    }
  ]
}

2 个答案:

答案 0 :(得分:1)

我会从最尖锐的物体到最大的物体。我的意思是你最后的模型(模型数据)应该是一个组合(或者我认为你可以查看你的数据图)。

因此,当您收到数据时,我会首先填充处理代理的集合,然后构建模型传递名称,位置..etc,并在init调用处理代理的集合。

对我而言,您可能/可以拥有冗余的唯一原因是您正在从较低级别构建更高级别的数据模型(由多个小型数据实体组成)。

因此,您解释的两种解决方案都是可行的,但对我来说更有意义的解决方案是:

  1. 设置代理商集合
  2. 构建较高的“ModelData”(不知道其名称...... =))从init中的代理程序集合中获取代理程序部分。
  3. 这就像你的init解决方案,但在另一种方式(从原子部件到组合)。

    我希望它有所帮助,而且我已经足够清楚地解释了我的观点:)

    我会写:     var agentModel = new AgentModel({SpecificAgentModelData(name,id ...)});

    在AgentModel的init中,我将获得agentCollections中的内容。

    init: function({specificAgentModelData}) {
       set.thespecificThing;
       set.otherThingsfromAgentCollection(get.agentCollection...);
    }
    

    原则是你有2个部分A和B,你首先设置A和B因为它们是基本数据然后你做组成C = A + B 在这个例子中,C在实例化新C({A})时得到A并在其初始化中得到B但我们可以想象你A& B分别和C在其init中都是纯粹的组合/抽象/收集其他最小的实体。 抱歉丑陋的伪代码,它更清楚吗?

答案 1 :(得分:0)

您可以使用backbone-relational作为骨干插件来定义复杂的模型/集合层次结构。您无需定义简单属性,它们将自动包含在您的模型中。

http://backbonerelational.org/

MyModel = Backbone.RelationalModel.extend({
relations: [{
    type: Backbone.HasMany,
    key: 'agents',
    relatedModel: 'Agent',
}]
});

键应该是数组的JSON键,relatedModel是具有属性id,名称的主干模型,如果将类型定义为Backbone.HasMany,则会将“代理”转换为集合。

然后this.model.get('agents')将为您提供一个集合。