【问题标题】:How do I use & access a Backbone.js Collection as property/attribute in a Model?如何使用和访问 Backbone.js 集合作为模型中的属性/属性?
【发布时间】:2012-12-05 23:51:04
【问题描述】:

我是 Backbone 的新手(仍然停留在 Ruby on Rails 模式中),并且对于如何将集合作为属性/属性添加到模型中有点困惑(“属性”是正确的术语吗?)。

例如,我有一个名为 current_plan 的模型和一个名为 json_dump 的变量,该变量是从服务器返回的,其中包含一个 participants 数组。我希望它有一个名为participants 的属性(它是参与者的集合),从 json_dump.participants 变量中填充它,并且能够使用类似 `current_plan.participants.where({first_name: "Dan"} )。

这是我的初始化函数的一些 sn-ps:

var current_plan = new Plan();

current_plan.set({attribute: val} ...other attributes... );
current_plan.participants = new Backbone.Collection(json_dump.participants);

但这迫使我访问常规属性,例如:current_plan.attributes.attribute。另外,我可以看到current_plan.attributes.participants.models 中有正确的数据,但我不知道如何使用current_plan 上的任何收集方法。

显然,我不明白发生了什么,以及为什么涉及这么多额外的层。 Backbone 文档似乎有点稀疏,我无法在 SO 或 Google 搜索中找到与我想要做的匹配的任何内容。如果还有其他问题或教程可以解释这一点,我将非常感谢有人指出我的意思。我还看到了Backbone Relational 项目,这似乎是我需要的,但在我了解基础知识之前,我不希望向 Backbone 添加更多复杂性。

感谢您为帮助新 Backbone 用户提供的任何帮助!

【问题讨论】:

  • 我没有将其发布为答案,因为我还没有尝试过,但是当我忘记模型希望我使用“get”而不是直接访问属性时,主干让我很多次像这样: current_plan.get('participants') 有什么帮助吗?
  • Jason,我试过了,但它只返回 Collection 并且不允许我使用任何 Collection 方法。不过谢谢:)
  • current_plan.participants = ... 对我来说似乎不应该工作,我想你会想要 current_plan.set({participants: ...});另外,在将 Backbone 集合分配给模型之前,您是否检查过它是否正常工作?
  • 它得到了回答,但不是这里的答案。

标签: javascript backbone.js model-associations backbone-relational backbone.js-collections


【解决方案1】:

我认为主干框架没有官方方法来处理模型和集合之间的关系,并且我不使用主干关系,但我的主干集合/模型中有多个关系。 当我使用集合定义关系模型时,我将其用作模型对象的属性,而不是主干属性,因此:

var current_plan = new Backbone.Model(); //or backbone model extended 
current_plan.participants = new Backbone.Collection(json_dump.participants);

然后正如@andrew-hubbs 所说,您应该始终使用主干 api 来处理模型和集合属性,以使您的代码与主干版本保持一致。 然后你可以像这样访问/设置模型属性

current_plan.get('property'); 
participant = current_plan.participants.get(1);
participant.get('property');
participant.set('name', 'bob');

【讨论】:

  • 我通常采用这种方法,更喜欢保持我的属性平坦且易于序列化。不过,这在某种程度上是个人喜好。
【解决方案2】:
var currentPlan = new Plan(); // Assuming Plan is a Backbone.Model
currentPlan.set("participants", new Backbone.Collection(json_dump.participants));
currentPlan.get("participants") instanceof Backbone.Collection
currentPlan.get("participants").at(0) instanceof Backbone.Model

您应该始终通过 get/set 方法访问 Backbone 模型上的属性哈希。如果这不起作用,那么您的 json_dump.participants 可能格式不正确。你可以从这种collection instantiation here的文档中看到一个例子。

是的 Backbone.Relational 是一个基本上可以处理这个问题的项目。它允许您定义模型之间的关系。然后,它可以很容易地自动将集合创建为模型实例的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多