В более сложных ситуациях я бы пошел для пользовательских событий.
вместо привязки к изменению: att1 или change: att2 я бы искал определенное пользовательское событие, которое вы запускаете после установкивсе атрибуты, которые вы хотели изменить в модели.
model.set({
att1:val1,
att2:val2
});
model.trigger('contact:updated'); // you can chose your custom event name yourself
model.bind('contact:updated', func1);
...
func1 = function() {
var att2 = model.get('att2');
}
Недостатком этой идеи является добавление новой строки кода везде, где вы хотите вызвать событие.если это случается много, вы можете изменить или переопределить model.set (), чтобы сделать это за вас, но тогда вы уже меняете магистральный код, не знаю, что вы думаете по этому поводу.
РЕДАКТИРОВАТЬ
после просмотра исходного кода магистрали, я заметил, что событие change
запускается сразу после срабатывания change:attribute
.(доказано фрагментом ниже)
// Fire `change:attribute` events.
for (var attr in changes) {
if (!options.silent) this.trigger('change:' + attr, this, changes[attr], options);
}
// Fire the `"change"` event, if the model has been changed.
if (!alreadyChanging) {
if (!options.silent && this._changed) this.change(options);
this._changing = false;
}
, тогда как this.change(options);
относится к этому:
change: function(options) {
this.trigger('change', this, options);
this._previousAttributes = _.clone(this.attributes);
this._changed = false;
},
, так что если вы будете привязываться к событию change
вместо конкретногоchange:argument
событие, вы получите функцию обратного вызова после того, как оба (или все) атрибуты будут изменены.
Единственный недостаток - он активируется при ЛЮБОМ изменении, даже если вы измените третий или четвертый атрибут.вам нужно посчитать, что в ...
небольшой пример того, как это работает на jsfiddle http://jsfiddle.net/saelfaer/qm8xY/