2012-03-27 5 views
5

В backbone.js, я замечаю, что события change и all на Model не срабатывают, если вы используете set атрибуты Модели для существующих атрибутов.backbone.js: событие модели, которое срабатывает при настройке атрибутов на существующие значения?

Например, если настроить следующие события:

ActiveUser.bind('change', this.displayActiveUser, this); 
ActiveUser.bind('all', this.displayActiveUserAll, this); 

И затем я вручную установить значение ActiveUser в пустую строку:

ActiveUser.set({ text : '' }); 

события огня тогда и только если ActiveUser.text еще не установлен в пустую строку.

Это разумное поведение. Тем не менее, есть ли событие, которое я могу использовать, которое срабатывает, даже если заданное значение является существующим значением?

Обновление: Я ничего не вижу в официальной Backbone.js list of events. Хм.

+2

Вы всегда можете запустить вручную 'ActiveUser.trigger ('change')' – abraham

+0

Спасибо - вот что я сделаю! – Richard

+0

Я добавил свой комментарий в качестве ответа. – abraham

ответ

8

Вы всегда можете вызвать событие изменения вручную с ActiveUser.trigger('change');.

1

Похоже, вам нужен подкласс Backbone.Model, который является родительским классом любого из ваших собственных классов моделей, которые хотят этого поведения. Переопределите метод set что-то вдоль этих линий. Логика только для того, чтобы срабатывать только события с изменениями, кодируется в Backbone.Model.set таким образом, чтобы не было легко поддерживать добавление новой опции.

(... выписка ...)

set: function(key, value, options) { 
    //Handle both "key", value and {key: value} -style arguments. 
    if (_.isObject(key) || key == null) { 
     options = value; 
    } 
    this.change(options); //This fires the event 
    Backbone.Model.prototype.set.apply(this, arguments);//Trigger normal behavior as well 
3

событие изменения Trigger вручную, как Абрам сказал

MyModel.trigger('change') 

Таким образом, ее можно вызвать событие изменения вручную, но это не будет хорошо работать в некоторых случаях. Рассмотрим случай, когда ваш метод рендеринга принимает свойства модели, а ваша модель пуста изначально, поэтому, если ваш код задает что-то на модели и прямо после этой строки вы говорите MyView.render() или MyModel.trigger('change'), тогда что произойдет, ваш метод визуализации может быть быстрее и даже не займет новые свойства.

Быстрый Hacky альтернативой может быть каждый раз, когда вы установили что-то, генерировать случайные числа вдоль и передать его в модель:

MyModel.set({myProperty:something,rand:Math.random()}); 

или

MyModel.set({myProperty:something,t:(new Date).getTime()}); 

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

В качестве альтернативы можно воспользоваться методом Питера Лиона.

+0

Хакерная альтернатива, безусловно, работает, но прямой триггер гораздо более очевиден. –