2015-03-22 3 views
0

Есть ли способ принудительно изменить: событие атрибута запускается с помощью model.set(), даже если атрибут havent изменен?backbonejs model.set, событие триггера в любом случае

model.set('attribute', 2); // will trigger the change:attribute event 
model.set('attribute', 2); // will not trigger again since the value has not changed 

Итак, есть ли способ запустить второй набор, даже если значение havent изменилось? Спасибо за ваше время.

ответ

2

Непревзойденный Backbone.Model.set(...). Я никогда не нуждался в этой функциональности ... дизайн «только огонь, когда он менялся» поощряет лучшие практики распространения событий, я думаю. Но вы можете просто предоставить метод, который молча удаляет значение, а затем снова устанавливает его снова.

Edit: Per mu is too short «s комментарий ниже, вы также должны обрабатывать возможность setLoudly даться хэш атрибутов. Таким образом, потребность в clearSilently метод, который обрабатывает как отдельные атрибуты, а также хэши:

var MyModel = Backbone.Model.extend({ 
    setLoudly: function(attr, value, options) { 
     this.unset(attr, { silent: true }); 
     return Backbone.Model.prototype.set.call(this, attr, value, options); 
    }, 

    clearSilently: function(attr) { 
     if (_.isString(attr)) { 
      this.unset(attr, { silent: true }); 
     } else { 
      _.each(_.keys(attr), function(key) { 
       this.unset(key, { silent: true }); 
      }, this); 
     } 
    } 
}); 

var myModel = new MyModel({ 
    foo: "bar", 
    baz: 4 
}); 

myModel.set('foo', 'bar'); // <<=== No Event 
myModel.setLoudly('foo', 'bar'); // <<=== One 'change change:foo' event 
myModel.set({ 
    foo: "bar", 
    baz: 4 
}); // <<=== No Events 
myModel.setLoudly({ 
    foo: "bar", 
    baz: 4 
}); // <<=== Will receive 'change change:foo change:baz' 

Если вы хотите всегда использовать этот метод при установлении данных, просто назовите его set вместо setLoudly и вы должны быть хорошо. YMMV.

+0

Совершенно верно. Расширено решение для адреса. –

1

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

  1. Измените источник Backbone, чтобы переопределить это поведение - снимите флажок. (не рекомендуется)
  2. Переопределить Backbone.Model.set(...), как предложил Питер Вагенер.
  3. Активизируйте change событий вручную:

    model.set('attribute', 2, {silent:true}); //Pass silent to prevent 2 change events if the attribute actually changed. 
    model.trigger('change'); 
    
Смежные вопросы