Javascript Backbone.js批量更新集合
我有一个对象集合,这些对象将被批量更新(不一定同时更新所有对象,但不止一个) 因此,我需要批量向服务器发送更新(即每个更新的对象不需要一个请求),并且我需要进行部分更新(即仅更新已更改的对象) 我遇到的问题有:Javascript Backbone.js批量更新集合,javascript,backbone.js,web,Javascript,Backbone.js,Web,我有一个对象集合,这些对象将被批量更新(不一定同时更新所有对象,但不止一个) 因此,我需要批量向服务器发送更新(即每个更新的对象不需要一个请求),并且我需要进行部分更新(即仅更新已更改的对象) 我遇到的问题有: 集合上没有save()方法(奇怪的是它有fetch()方法) 自上次与服务器同步以来,集合中已更改的模型没有内置跟踪功能 有没有一种干净、优雅的方式来实现这一点 我已经研究并尝试了一些事情,但所有的解决方案都相当笨拙和过于复杂——这对于一个旨在简化这类事情的框架来说是不可接受的 毫无疑问
save()
方法(奇怪的是它有fetch()
方法)毫无疑问,有一种体面的方式来做这样一件普通的事情。或者我应该使用另一个框架,例如Angular JS?您可以只构建模型的JSON表示数组。像这样的
Backbone.Collection.prototype.save = function()
{
var data = [];
for (var n = 0; n < this.length; ++n)
{
data.push(this.models[n].toJSON());
}
// save data through jQuery
console.log(data);
};
var col = new Backbone.Collection();
col.add({status: true});
col.add({status: false});
col.save();
Backbone.Collection.prototype.save=function()
{
var数据=[];
对于(变量n=0;n
您可以添加一些
model.hasChanged()
检查以防止不必要的节省。为了帮助发现此问题的任何人,我最终使用了以下内容(基于@joconja的答案):
Backbone.Collection.prototype.saveChanges=function(){
var数据=[];
对于(变量i=0;i
为什么需要批量更新收藏项目?它们真的可以在应用程序中同时更改吗?如果否,则通常的做法是在更改某个项目后调用model的save
方法。@最后面的是,可以同时更改这些项目。有一个项目列表,其中包含用于选择项目的复选框,用户可以一次对所有选择的项目执行更改(例如,一次更改10个项目的状态-我不希望我的服务器为此收到10个ajax请求),然后您一定要更改应用程序数据的结构。您不应该在包含单个布尔值的模型上构建集合(复选框选中状态)。最好使用包含复选框状态数组的单个模型,而不是在您的案例中使用集合。@最后面的模型不包含布尔复选框状态-这只是UI的一部分。该模型包含有用的数据,用户界面中的复选框供用户选择要操作的模型。谢谢@joconja。这看起来不错。我将尝试一下,看看它是如何进行的。
Backbone.Collection.prototype.saveChanges = function() {
var data = [];
for (var i = 0; i < this.length; ++i) {
if (this.models[i].hasChanged()) {
var changes = this.models[i].changedAttributes();
changes.id = this.models[i].get('id');
data.push(changes);
this.models[i].changed = {};
}
}
Backbone.ajax({
url: this.url,
method: 'PUT',
contentType: 'application/json',
data: JSON.stringify(data)
});
};