Backbone — Возможно ли привязать событие изменения к модели, за исключением одного свойства?

#javascript #backbone.js #javascript-framework

#javascript #backbone.js #javascript-framework

Вопрос:

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

 model.bind('change:prop1', func);
model.bind('change:prop2', func);
model.bind('change:prop3', func);
etc....
  

Или, альтернативно, есть ли способ выяснить, какое свойство вызвало изменение из обработчика событий?

Ответ №1:

Вы могли бы использовать model.bind('change',function() {/*...*/}) и в функции use hasChanged для проверки атрибутов: if(model.hasChanged('propIWantToExclude')) return;

Комментарии:

1. Кто-нибудь может ответить на первую часть вопроса? ie. Как запускать событие изменения всякий раз, когда я изменяю какое-либо свойство модели, кроме одного?

2. ^ просто используйте «изменить», как в ответе … хотя я вижу, что оно было отредактировано, так что вы, вероятно, спрашивали перед редактированием 🙂

Ответ №2:

Ответ Джастина выше вернется, когда ‘propIWantToExclude’ и некоторые другие атрибуты будут изменены вместе. Вы, вероятно, не хотите этого делать, поэтому вам также следует посмотреть на размер model.changedAttributes :

 if(model.changedAttributes.length == 1 amp;amp; model.hasChanged('attrIWantToExclude')) {
    return;
}
  

Комментарии:

1. Должно быть: «model.hasChanged(‘attrIWantToExclude’) amp;amp; Object.keys(model.changedAttributes()).length == 1». Или «Object.keys(model.changed)». длина == 1 amp;amp; …». changedAttributes — это функция, которая возвращает хэш измененных объектов или false, если их нет. хэш. длина не работает, поэтому вам нужно что-то вроде этого: Object.keys(хэш). длина. ошибки changedAttributes и Object.keys (false) могут возвращать false, поэтому вам нужен тест hasChanged перед ссылкой Object.keys на changedAttributes (или же ссылка на внутреннюю model.changed). — backbonejs.org/#Model-changedAttributes

Ответ №3:

Отвечая на просьбу Дэвида Туита ответить на первую часть вопроса, вы могли бы настроить функцию для ответа на событие «изменено», а затем запустить пользовательское событие, если свойство, которое вы хотите игнорировать, не было изменено.

Эта логика вызвала бы пользовательское событие: 'somePropertyOtherThanThePropIWantToExcludeChanged' если свойство не было изменено. Если было изменено несколько свойств, включая то, которое вы хотите игнорировать, пользовательское событие также НЕ сработало бы:

 model.bind('change', function(){
    if( !model.hasChanged('propIWantToExclude') ){
        model.trigger('somePropertyOtherThanThePropIWantToExcludeChanged');
    }
});
  

Комментарии:

1. Кто David Tuite ? Что такое «первая часть вопроса»?