#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
? Что такое «первая часть вопроса»?