我希望能夠在骨幹模型上調用save()並讓後端返回此模型的整個集合,而不僅僅是模型的已更改屬性。然後我會喜歡骨幹更新整個返回的集合。用例如下:保存Backbone.js模型並更新整個集合
用戶有多個地址,可以從這個集合中選擇一個送貨地址。如果她從集合中選擇不同的送貨地址,則應將之前的送貨地址更新爲「另一個普通地址」狀態。爲此,整個集合必須更新,而不是僅更改模型。
這是在backbone.js中的某種可能嗎?
非常感謝!
我希望能夠在骨幹模型上調用save()並讓後端返回此模型的整個集合,而不僅僅是模型的已更改屬性。然後我會喜歡骨幹更新整個返回的集合。用例如下:保存Backbone.js模型並更新整個集合
用戶有多個地址,可以從這個集合中選擇一個送貨地址。如果她從集合中選擇不同的送貨地址,則應將之前的送貨地址更新爲「另一個普通地址」狀態。爲此,整個集合必須更新,而不是僅更改模型。
這是在backbone.js中的某種可能嗎?
非常感謝!
綁定到集合的模型包含作爲屬性的集合父級。另外,既然你返回了一個模型列表,我們可以假定它總是在一個列表中。
mymodel = Backbone.Model.extend({
parse: function (data) {
if(this.collection && typeof(data) === 'array') {
this.collection.reset(data);
}
return data;
}
});
是的,這是可能的。你需要重寫型號
MyModel = Backbone.Model.extend({
sync: function(method, model) {
if (method === 'create') {
//perform save logic and update the model's collection
} else if (method === 'update') {
//perform save logic and update the model's collection
} else if (method === 'read') {
...
} else if (method === 'destroy') {
...
}
}
});
的sync
功能看看的Backbone.sync功能的更多信息。
我猜重寫同步沒有幫助太多這種使用情況,因爲它是不關心的響應從服務器回來(這是成功的回調方法的任務) – Hendrik 2012-04-04 11:14:42
你的用例實際需要的是更新兩個模型,而不是更新整個集合。 (除了提取,收集不會與Backbone中的服務器交互)假設您有地址A,B和C,並且A是當前送貨地址,C是新送貨地址,您的代碼可以簡單地爲:
如果你的問題是,你不知道其地址是當前地址(即地址A),那麼你可以你的收藏裏面進行搜索(即「給我目前的出貨地址「),更新C,然後更新返回的地址(地址A)。
如果你絕對需要更新整個集合(你不需要),循環通過collection.models
並單獨更新每個集合。在RESTful上採用集合的Backbone中根本沒有概念。
編輯:我可能誤解了你的問題。如果您的意思是更新客戶端上的集合(即,您不打算更新服務器上的集合),那麼代碼仍然類似,您只需更新舊模型和新模型。
是我其實是更新客戶端上的集合,這也是上述方法的問題,因爲如果我只是簡單地將C和A更新爲它們在客戶端上的新狀態,那麼如果它不能保存,它們的狀態將與服務器不同步在服務器上成功。 – Hendrik 2012-04-04 11:24:01
我不認爲重寫同步或打破保存回報的預期是必要的。
這將是簡單的我想重寫save
在模型上線的東西:
save: function (key, value, options) {
var p = Model.prototype.save.call(this, key, value, options),
self=this;
if (this.collection) {
p.done(function() { self.collection.fetch(); });
}
return p;
}
這將節省使用正常save
獲得承諾,然後如果在保存成功和模型是集合的一部分,它將從服務器獲取集合。
另一種方法是綁定到模型的change
事件,檢查它是否屬於集合和提取,但這也會發生在set
上。
好的,謝謝 - 這正是我想要的。 – Hendrik 2012-04-04 11:11:35
「typeof(data)==='array'」應該是「_.isArray(data)」,而不是btw。 – Hendrik 2012-04-10 17:27:34