2013-03-11 169 views
2

所以我有一個頁面,用戶在其中通過複選框從可用選項列表中進行選擇。 我有3個系列:一個用於可能的選項列表,一個用於當前保存的選項以及已保存選項的克隆。我使用克隆列表添加/刪除選項,因爲他們點擊複選框。backbone.js批量更新

var possibleOptions = new Backbone.Collection("/options"); 
var currentUserOptions = new Backbone.Collection("/useroptions", { id: 2 }); 
var clonedUserOptions = new Backbone.Collection(currentUserOptions.toJSON()); 

被採取這種做法的原因是,用戶可以取消該選項頁編輯中期如此想要的選項堅持在單擊保存按鈕。克隆的選項在選項被選中/未選中時被正確更新。但是,當我嘗試更新真實列表時,似乎沒有任何事情發生。

currentUserOptions.update(clonedUserOptions.toJSON()); 

我的期望是,骨幹會觸發新車型POST請求,並刪除了根據文檔(http://documentcloud.github.com/backbone/#Collection-update)每個缺少的模型。如果我誤解了這個假設如何工作,請讓我知道。一個簡單的正確方法的實例將不勝感激。

感謝, CF

+0

更新'currentUserOptions'您還需要保存它們後。像'currentUserOptions.each(function(item){item.save();})'''可以工作,或者至少是一個好的開始。 – 2013-03-11 19:29:43

+0

感謝Paul的回覆,但那些已刪除的選項呢?在執行currentUserOptions.each時,它們不再存在。 – user2158070 2013-03-11 19:39:39

+0

嗯好點。 'update'並不是真的要這樣使用,更多的是用來自服務器的數據更新你的集合。 – 2013-03-11 19:42:42

回答

0

這是我的理解,你有單獨的模型調用到更新服務器時的變化(例如人都提到)。有些事件可以涵蓋這些變化。不過,您可以使用同步功能發送整個集合。當每個模型被添加或刪除時,您可以將其標記爲新的並刪除,並且當您準備好保存時發送整個集合。當發送收集時,您的服務器方法必須處理確定適當的添加或刪除操作。

這是一個做批量同步的例子。而不是使用this.collection.remove(),你可能只想標記爲已刪除,正如我所提到的。這幾乎是服務器知道要刪除什麼的唯一方法。從技術上講,您可以刪除所有內容,然後添加大容量更新中發送的內容:)另外,當您保存更新實際刪除的內容時,您可能還需要從服務器獲取或返回一個集合。我不確定這對您的情況有幫助,但我已將其用於「完成時保存」一個按鈕概念的頁面。

var one = new model({ id: this.collection.length + 1}); 
    var two = new model({ id: this.collection.length + 2 }); 
    var three = new model({ id: this.collection.length + 3 }); 
    var four = new model({ id: this.collection.length + 4 }); 
    var five = new model({ id: this.collection.length + 5 }); 


    this.collection.add(one.toJSON()); 
    this.collection.add(two.toJSON()); 
    this.collection.add(three.toJSON()); 
    this.collection.add(four.toJSON()); 
    this.collection.add(five.toJSON()); 

    this.collection.sync('update', this.collection, { success: function() { console.log(this.collection.length); } }); 

    this.collection.remove(one); 
    this.collection.remove(two); 

    this.collection.sync('update', this.collection, { success: function() { console.log(this.collection.length); } }); 

而且你的情況:

currentUserOptions.sync('update', currentUserOptions, { success: function() { //do something } });