我已經結束了用一些方法來處理這個問題,以增強Backbone.Collection。
的saveChangeMethod創建要傳遞給Backbone.sync一個假人模型。模型中所有主幹的同步方法需求都是它的url屬性和JSON方法,所以我們可以很容易地將其敲除。
在內部,模型的toJSON方法只返回其屬性的副本(要發送到服務器),所以我們可以愉快地使用剛剛返回模型數組的toJSON方法。 Backbone.sync對此進行了字符串處理,這使我們只知道屬性數據。
成功時,saveChanged觸發關閉事件的集合進行一次處理。使用了一些代碼,它可以爲每個批次模型中已更改的每個屬性觸發特定事件一次。
Backbone.Collection.prototype.saveChanged = function() {
var me = this,
changed = me.getChanged(),
dummy = {
url: this.url,
toJSON: function() {
return changed.models;
}
},
options = {
success: function (model, resp, xhr) {
for (var i = 0; i < changed.models.length; i++) {
changed.models[i].chnageSilently();
}
for (var attr in changed.attributes) {
me.trigger("batchchange:" + attr);
}
me.trigger("batchsync", changed);
}
};
return Backbone.sync("update", dummy, options);
}
然後,我們只需要對集合的getChanged()方法。這將返回一個對象2周的特性,改變後的模型的陣列以及哪些屬性已改變的對象檢舉:
Backbone.Collection.prototype.getChanged = function() {
var models = [],
changedAttributes = {};
for (var i = 0; i < this.models.length; i++) {
if (this.models[i].hasChanged()) {
_.extend(changedAttributes, this.models[i].changedAttributes());
models.push(this.models[i]);
}
}
return models.length ? {models: models, attributes: changedAttributes} : null;
}
雖然這是預期的用途骨架「改變的模型」範式,整點的輕微濫用的配料是,當模型改變時,我們不希望發生任何事情(即任何事件發生)。
因此,我們必須將{silent:true}傳遞給模型的set()方法,所以使用backbone的hasChanged()來標記等待保存的模型是有意義的。當然,如果你爲了其他目的而默默地改變模型,這會有問題 - collection.saveChanged()也會保存它們,所以值得考慮設置一個替代標誌。在任何情況下,如果我們這樣做,當保存時,我們需要確保骨幹現在認爲模型沒有改變(不觸發它們的改變事件),所以我們需要手動操縱模型,就好像它沒有改變。該saveChanged()在我們改變模型方法進行迭代,並呼籲模式,這基本上是骨幹model.change()方法不觸發這個changeSilently()方法:
Backbone.Model.prototype.changeSilently = function() {
var options = {},
changing = this._changing;
this._changing = true;
for (var attr in this._silent) this._pending[attr] = true;
this._silent = {};
if (changing) return this;
while (!_.isEmpty(this._pending)) {
this._pending = {};
for (var attr in this.changed) {
if (this._pending[attr] || this._silent[attr]) continue;
delete this.changed[attr];
}
this._previousAttributes = _.clone(this.attributes);
}
this._changing = false;
return this;
}
用法:
model1.set({key: value}, {silent: true});
model2.set({key: value}, {silent: true});
model3.set({key: value}, {silent: true});
collection.saveChanged();
RE。 RESTfulness ..對集合的端點執行PUT以更改它的某些記錄是不正確的。從技術上講,PUT應該取代整個集合,但直到我的應用程序實際上需要替換整個集合時,我很樂意採取實用的方法。
相關:http://stackoverflow.com/questions/11819662/why-does-backbone-not-have-a-save-put-post-method-for-its-collections-is-i/11819965#11819965 | http://stackoverflow.com/questions/11042292/extend-backbone-sync-to-batch-sync | http://stackoverflow.com/questions/511281/patterns-for-handling-batch-operations-in-rest-web-services | http://stackoverflow.com/questions/8529919/how-to-update-a-set-of-records-using-backbone-js-rails – fguillen