如何使用Backbone在特定嵌套的对象数组中设置新的模型信息

How to set new model info in specific nested array of objects using Backbone?

本文关键字:数组 设置 信息 模型 对象 Backbone 嵌套 何使用      更新时间:2023-09-26

我有一个简单的联系人表单提交时应该设置我的模型的联系人部分内的值,我做了很少的设置/保存在一个模型上,所以我想知道是否有什么特别设置到模型的特定部分?

JS 要保存的数据(myNewContactObject)

{
  "name": "Joe Bloggs",
  "email": "joe@bloggs.com",
  "telephone": "0123456789"
}

应该保存到模型的嵌套联系人数组,示例结构:

[
  {
    "id": 1,
    "name": "model name",
    "teams": [
      {
        "name": "team one name"
      },
      {
        "name": "team two name"
      }
    ],
    "contacts": [
      {
        "name": "James Smith",
        "email": "james@gkugi.com",
        "telephone": "18917391847"
      }
    ]
  }
]

我可以直接写this.model.set(myNewContactObject)? or do I need to do something like this.model.contacts.set(myNewContactObject)?

或者,也许这种方法是错误的,我应该让collection out of the contactsContactsCollection一样,每次设置每个ContactModel ?

Backbone的Model.set有以下语法:

this.model.set('attribute-name', 'attribute-value')

因此,要将属性"contacts"设置为复杂数组对象,可以这样做:

var contacts = this.model.get('contacts');
contacts.push(myNewContactObject);

注意,在这种情况下,由于数组在JavaScript中是通过引用传递的,因此不需要调用contacts.set;get()调用返回一个引用,通过该引用可以直接改变联系人数组。但是,如果构建一个新的数组:

var newContacts = [myNewContactObject];

你需要这样设置:

this.model.set('contacts', newContacts);

请注意,您希望修改的属性是作为参数传递的,而不是作为模型的属性引用的,因此您提到的this.model.contacts.set语法在任何情况下都不起作用。

请记住,Backbone允许您将复杂对象设置为属性的值,但它不会帮助您将该属性挖掘到任意深度。要做到这一点,你需要一个像backbone-deep-model这样的主干插件,它可以与npm installbower install一起安装。这将允许你这样做:

this.model.get('contacts.0.name')

如果没有这样的东西,你只能做:

this.model.get('contacts'),然后解析出您想要的联系人/属性。

你也可以做你提到的,并创建一个联系人的集合,但这在很大程度上取决于你计划如何在你的后端建模你的数据。如果在后端设置了关系API,例如api/v1/persons/<person-id>/contacts,那么您可能希望使用该URL创建联系人集合,并为每个人创建相关集合。在这个例子中,是的,你数组中的每个联系人对象实际上会是它自己的模型,你的"数组"会是一个backbone。collection。这是否是正确的方法取决于您的建模。

如果您有兴趣这样做,您可能想看看backbone-relational,尽管使用Backbone处理关系数据的概念是一个有争议的领域。