【问题标题】:How to update model in collection?如何更新集合中的模型?
【发布时间】:2013-03-18 19:24:36
【问题描述】:

我有以下 Backbone.js 集合:

 var Tags = Backbone.Collection.extend({
        url: "/api/v1/tags/"
 }),

如何更新集合中的一个模型,以便它发布到 /api/v1/tags/id 并保存该模型的数据。

所以如果我更改集合中 id 为 2 的模型名称 它应该 PUT 到 /api/v1/tags/2 包含以下数据: 名称:新名称 id:2

【问题讨论】:

  • 你试过model.save({name:'new name'}); 吗?

标签: backbone.js


【解决方案1】:

我最近还想更新集合中的特定模型。问题是,如果我只使用 model.save 它不会更新集合。目标是更改集合中的模型,在服务器上更改它,相应地更新集合而不使用sync 方法。例如,我有我的变量collection,我想用id = 2 更改模型。

首先,我将创建一个实例模型,如下所示:
var model = collection.get(2)

然后我将更新此特定模型的属性:
model.set({name: 'new name'})

然后我将它保存到服务器:
model.save({}, {url:'/api/v1/tags/'+model.get('id')})

然后我们必须根据更改更新集合:
collection.set({model},{remove: false})

set 方法 - 它是对集合的“智能”更新,其中包含您传入参数的模型列表。
remove: false 参数 - 这是集合删除集合中现有模型的限制。更多here

【讨论】:

    【解决方案2】:

    您可能会错过的第一件事是,在相应的标签模型中,您需要设置“urlRoot”以匹配集合的“url”。否则它根本不知道集合:

    var Tag = Backbone.Model.extend({
       urlRoot: "/api/v1/tags"
    });
    
    var Tags = Backbone.Collection.Extend({
       model: Tag,
       url: "/api/v1/tags"
    });
    

    如果您想单独保存标签,这很有用:

    var tag = collection.get(2);
    tag.set({key: "something"});
    tag.save();   // model.save works because you set "urlRoot"
    

    在集合上,如果 id 不为空,“create()”也是“update()”。这并不令人困惑。 :) 因此,这几乎等同于前面的示例:

    collection.create({id: 2; key: "something"});
    

    这将使用 id=2 更新现有标记,然后触发 PUT。

    这是一个古老的问题;回答是因为我正在寻找相同的答案——您可能早就解决了这个问题并继续前进。 :)

    【讨论】:

      【解决方案3】:

      您可以将变量传递给save 方法。它接受 jQuery 的 ajax 方法使用的所有选项(除非你覆盖了 Backbone.Sync

      你可以这样做:

      model.save( { name:'new name' } );

      Backbone 会自动为您添加idPUT 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多