Tất cả các câu trả lời gợi ý lắng nghe những thay đổi (sử dụng các sự kiện) là chính xác trừ khi bạn vượt qua {im lặng: đúng} tùy chọn. Trong trường hợp đó, bạn cần ghi đè phương thức thiết lập mặc định để lưu các thuộc tính đã thay đổi và đặt lại danh sách đó sau khi gọi phương thức lưu.
Nửa đêmLời trả lời của câu trả lời là không chính xác. Nếu bạn gọi thiết lập phương pháp hai lần sau đó changedAttributes sẽ trở lại chỉ thuộc tính có thay đổi kể từ cuộc gọi thiết lập cuối cùng - đó là trong tài liệu Backbone:
changedAttributesmodel.changedAttributes([attributes])
Lấy một hash của các thuộc tính duy nhất của mô hình đã thay đổi kể từ tập cuối cùng hoặc sai nếu không có.
Trong trường hợp của tôi, tôi giải quyết vấn đề với mã này:
(function(_, Backbone) {
'use strict';
var _set = Backbone.Model.prototype.set,
_save = Backbone.Model.prototype.save;
_.extend(Backbone.Model.prototype, {
set: function(key, val, options) {
var options = this._getOptions(key, val, options),
toReturn = _set.call(this, key, val, options);
if(!_.isUndefined(options) && options.silent && !!this.changedAttributes()) {
this.silentChanges = _.extend([], this.silentChanges);
[].push.apply(this.silentChanges, _.keys(this.changedAttributes()));
}
return toReturn;
},
save: function(key, val, options) {
var options = this._getOptions(key, val, options),
toReturn = _save.call(this, key, val, options);
if(!_.isUndefined(options) && options.triggerSilents) {
this.triggerSilentChanges();
}
return toReturn;
},
unset: function(key, options) {
if(!_.isUndefined(options) && options.silent) {
this.silentChanges = _.extend([], this.silentChanges, _.keys(this.changedAttributes()));
}
},
triggerSilentChanges: function() {
if(!_.isEmpty(this.silentChanges)) {
var that = this;
_.each(this.silentChanges, function(key) {
that.trigger('change:' + key);
that.silentChanges = _.without(that.silentChanges, key);
});
Backbone.Model.prototype.trigger.call(this, 'change');
}
},
_getOptions: function(key, val, options) {
if(key == null || _.isObject(key)) {
return val;
}
return options;
}
});
})(_, Backbone);
Nếu tôi muốn có được tất cả đã thay đổi thuộc tính tôi sử dụng tài sản silentChages bên trong mô hình. Nếu tôi muốn kích hoạt sự kiện cho tất cả các thuộc tính set/unset khi tôi lưu, tôi thêm tùy chọn 'triggerSilents: true'. Tôi cũng có thể kích hoạt tất cả sự kiện thay đổi theo cách thủ công bằng cách gọi phương thức triggerSilentChanges.
Bit bẩn không giống như kiểm tra xem nó có thay đổi hay không (tùy thuộc vào định nghĩa của bạn). Ví dụ: mô hình ban đầu có thể là: Tốt: true, thay đổi thành isGood: false, sau đó quay lại isGood: true. Các bit bẩn sẽ được trong trường hợp này, nhưng mô hình không thực sự thay đổi. Có được không? – Matt