2013-03-11 101 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 } });