Backbone.js 批量更新集合
Backbone.js updating a collection in bulk
我有一组对象将被批量更新(不一定同时 所有,但不止一个)。
因此我需要向服务器批量发送更新(即不是每个更新的对象一个请求),我需要做部分更新(即只更新已更改的对象)。
我遇到的问题:
- 集合上没有
save()
方法(考虑到它有 fetch()
方法很奇怪)
- 没有内置跟踪自上次与服务器同步后集合中发生更改的模型。
是否有一种干净、优雅的方法来实现这一目标?
我已经研究并尝试了一些东西,但所有的解决方案都相当笨拙且过于复杂 - 这对于旨在简化此类事情的框架来说是不可接受的。
在 Backbone 中肯定有一个不错的方法来做这种常见的事情。或者我应该使用另一个框架,例如AngularJS?
您可以只构建模型的 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();
您可以添加一些 model.hasChanged()
检查以防止不必要的节省。
只是为了帮助任何发现这个问题的人,这就是我最终使用的(基于@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)
});
};
我有一组对象将被批量更新(不一定同时 所有,但不止一个)。
因此我需要向服务器批量发送更新(即不是每个更新的对象一个请求),我需要做部分更新(即只更新已更改的对象)。
我遇到的问题:
- 集合上没有
save()
方法(考虑到它有fetch()
方法很奇怪) - 没有内置跟踪自上次与服务器同步后集合中发生更改的模型。
是否有一种干净、优雅的方法来实现这一目标?
我已经研究并尝试了一些东西,但所有的解决方案都相当笨拙且过于复杂 - 这对于旨在简化此类事情的框架来说是不可接受的。
在 Backbone 中肯定有一个不错的方法来做这种常见的事情。或者我应该使用另一个框架,例如AngularJS?
您可以只构建模型的 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();
您可以添加一些 model.hasChanged()
检查以防止不必要的节省。
只是为了帮助任何发现这个问题的人,这就是我最终使用的(基于@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)
});
};