backbone.js批量更新

时间:2013-03-11 18:51:50

标签: backbone.js

所以我有一个页面,用户通过复选框从可用选项列表中进行选择。 我有3个集合:一个用于可能的选项列表,一个用于当前保存的选项,以及已保存选项的克隆。我在点击复选框时使用克隆列表添加/删除选项。

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

采用这种方法的原因是用户可以在编辑中间取消选项页面,因此希望在单击保存按钮时保留选项。选中/取消选中选项时,clonedOptions会正确更新。但是,当我尝试更新真实列表时似乎没有任何事情发生。

currentUserOptions.update(clonedUserOptions.toJSON());

我的期望是骨干会根据文档(http://documentcloud.github.com/backbone/#Collection-update)触发新模型的发布请求和每个缺失模型的删除。如果我误解了这是如何工作的,请告诉我。非常感谢正确方法的一个简单工作示例。

谢谢, CF

1 个答案:

答案 0 :(得分: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 } });