2013-03-18 112 views
11

我有以下Backbone.js的集合:如何更新集合中的模型?

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

如何更新集合中的車型之一,以便它發佈到/ API/V1 /標籤/ ID和保存數據,該模型。

所以,如果我收集 在更改產品型號名稱與編號2應該投入到 /API/V1 /標籤/ 2以下數據: 名稱:新名稱編號:2

+0

你試過'model.save({name:'new name'});'? – 2013-03-18 20:36:31

回答

2

你可以將變量傳遞給save方法。它接受jQuery的ajax方法使用的所有選項(除非你overrided Backbone.Sync

你可以這樣做:

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

idPUT方法會自動由Backbone爲您添加。

+0

你也可以使用HTTP補丁來進行選擇性更新 – 2013-03-21 10:20:06

21

我最近也想更新集合中的特定模型。問題是,如果我確實使用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

7

您可能會錯過的第一件事是,在您對應的標記模型中,您需要設置「urlRoot」以匹配Collection的「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" 

的收集,「創建()」也「 update()「如果id不爲null。這並不令人困惑。 :)因此,這與前面的示例非常相似:

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

這將更新id = 2的現有標記,然後觸發PUT。

這是一個古老的問題;回答是因爲我正在尋找相同的答案 - 你可能早就解決了這個問題,並且繼續前進。 :)