2015-02-24 4 views
3

У меня есть Модели, которая в инициализации функции У меня есть следующий код:Backbone listenTo несколько атрибутов стрельбы несколько событий

this.listenTo(this, 'change:re change:read', this.patch); 

патча функции выглядит следующим образом:

patch: function(object) { 
    this.save(object.changed, { patch: true }); 
}, 

В других местах моей заявки я могу запустить:

model.set({ re: 1 }); 

или:

model.set({ read: new Date() }); 

оба из которых работают отлично, но когда я звоню:

model.set({ re: 1, read: new Date() }); 

патч функция вызывается дважды, и есть два круглых поездки на сервер. Я хотел бы оставить это в одной поездке туда и обратно, если это возможно.

Может ли кто-нибудь помочь с этим?

Большое спасибо

Дэвид

ответ

3

Ваш patch метод вызывается один раз для 'change:re' события и снова для 'change:read' события. Магистраль не знает, что вы действительно имеете в виду «скажите мне, если изменится хотя бы один из re10 или read», он просто знает, что вы хотите, чтобы сказали, что изменения re и сказали, если изменения read.

Вы можете слушать 'change' событий и сделайте фильтрацию самостоятельно, используя changed хэш:

изменилmodel.changed

изменилось свойство является внутренней хэш, содержащий все атрибуты, которые были изменены с последнего набор.

Что-то вроде этого:

this.listenTo(this, 'change', this.patch); 

, а затем:

patch: function() { 
    if('re' in this.changed || 'read' in this.changed) 
    this.save(this.changed, { patch: true }); 
} 

Демо: https://jsfiddle.net/ambiguous/ja20z021/

+0

Большое спасибо, кажется очевидным сейчас! ;-) – David

0

Вы можете debouce функцию исправления с помощью _.debounce, например, так:

this.listenTo(this, 'change:re change:read', this.patch);

, а затем:

patch: _.debounce(function(object){ 
    this.save(object.changed, { patch: true }); 
},100) 

"100" в миллисекундах, то время ваша функция ожидает перед вызовом сохранения(). В течение этого периода может произойти любое количество изменений, но сохранение вызывается только один раз.

Смежные вопросы