Todas las respuestas que sugieren la escucha de cambios (usando eventos) son correctas a menos que pase {silenciosa: verdadera} opción. En ese caso, debe sobrescribir el método de configuración predeterminado para guardar los atributos que han cambiado y restablecer esa lista después de llamar al método de guardar.
La respuesta de MidnightLightning no es correcta. Si establecimiento de llamada método de dos veces y luego changedAttributes volverán sólo los atributos que tiene el cambio desde la última llamada conjunto - está en la documentación Backbone:
changedAttributesmodel.changedAttributes([attributes])
Recuperar un hash de atributos sólo el del modelo que han cambiado desde la último conjunto, o falso si no hay ninguno.
En mi caso he resuelto el problema con este código:
(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);
Si quiero conseguir todo cambió atributos utilizo propiedad silentChages dentro del modelo. Si deseo desencadenar evento para todos los atributos set/unset cuando guardo, agrego la opción 'triggerSilents: true'. También puedo activar manualmente todos los eventos de cambios llamando al método triggerSilentChanges.
el bit de modificación no es lo mismo que comprobar si ha cambiado (dependiendo de su definición). Ejemplo: el modelo podría ser inicialmente bueno: verdadero, cambia a es Bueno: falso, luego vuelve a ser Bueno: verdadero. El bit más sucio estaría activado en este caso, pero el modelo en realidad no está cambiado. ¿Está bien? – Matt