2012-04-03 107 views
1

我希望能夠在骨幹模型上調用save()並讓後端返回此模型的整個集合,而不僅僅是模型的已更改屬性。然後我會喜歡骨幹更新整個返回的集合。用例如下:保存Backbone.js模型並更新整個集合

用戶有多個地址,可以從這個集合中選擇一個送貨地址。如果她從集合中選擇不同的送貨地址,則應將之前的送貨地址更新爲「另一個普通地址」狀態。爲此,整個集合必須更新,而不是僅更改模型。

這是在backbone.js中的某種可能嗎?

非常感謝!

回答

4

綁定到集合的模型包含作爲屬性的集合父級。另外,既然你返回了一個模型列表,我們可以假定它總是在一個列表中。

mymodel = Backbone.Model.extend({ 
    parse: function (data) { 
    if(this.collection && typeof(data) === 'array') { 
     this.collection.reset(data); 
    } 
    return data; 
    } 
}); 
+0

好的,謝謝 - 這正是我想要的。 – Hendrik 2012-04-04 11:11:35

+1

「typeof(data)==='array'」應該是「_.isArray(data)」,而不是btw。 – Hendrik 2012-04-10 17:27:34

1

是的,這是可能的。你需要重寫型號

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功能的更多信息。

+0

我猜重寫同步沒有幫助太多這種使用情況,因爲它是不關心的響應從服務器回來(這是成功的回調方法的任務) – Hendrik 2012-04-04 11:14:42

0

你的用例實際需要的是更新兩個模型,而不是更新整個集合。 (除了提取,收集不會與Backbone中的服務器交互)假設您有地址A,B和C,並且A是當前送貨地址,C是新送貨地址,您的代碼可以簡單地爲:

  1. 將C更新爲新的送貨地址。
  2. 更新A爲'只是另一個地址'。

如果你的問題是,你不知道地址是當前地址(即地址A),那麼你可以你的收藏裏面進行搜索(即「給我目前的出貨地址「),更新C,然後更新返回的地址(地址A)。

如果你絕對需要更新整個集合(你不需要),循環通過collection.models並單獨更新每個集合。在RESTful上採用集合的Backbone中根本沒有概念。

編輯:我可能誤解了你的問題。如果您的意思是更新客戶端上的集合(即,您不打算更新服務器上的集合),那麼代碼仍然類似,您只需更新舊模型和新模型。

+0

是我其實是更新客戶端上的集合,這也是上述方法的問題,因爲如果我只是簡單地將C和A更新爲它們在客戶端上的新狀態,那麼如果它不能保存,它們的狀態將與服務器不同步在服務器上成功。 – Hendrik 2012-04-04 11:24:01

2

我不認爲重寫同步或打破保存回報的預期是必要的。

這將是簡單的我想重寫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上。

+0

我還沒有嘗試過,但我想這實際上可以處理額外請求週期的小麻煩。 – Hendrik 2012-04-04 11:19:44

+0

@亨德里克你在哪裏看到額外的週期? – ggozad 2012-04-04 14:12:45

+0

那麼,如果我不會錯過任何東西,那麼模型會首先保存,如果成功,那麼客戶端將獲取該集合。如果服務器只是在模型成功存儲後直接返回集合,那麼整個操作只需要少一個請求。我錯了嗎? – Hendrik 2012-04-04 16:59:43

相關問題