Предотвращение повторного вызова функции при связывании в Backbone? - PullRequest
0 голосов
/ 24 октября 2011

Когда любой из двух атрибутов ("a" или "b") изменяется в моей модели Backbone, я бы хотел вычислить третий атрибут "c":

initialize: function() {
  this.bind("change:a", this.calculateC);
  this.bind("change:b", this.calculateC);
},

calculateC: function() {
  this.attributes.c = ...
}   

Что является хорошим способом предотвратить повторное вычисление c, если в модели одновременно установлены и a, и b?

1 Ответ

2 голосов
/ 24 октября 2011

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

// Set a hash of model attributes on the object, firing `"change"` unless you
// choose to silence it.
set : function(attrs, options) {
  // ...

  // Update attributes.
  for (var attr in attrs) {
    var val = attrs[attr];
    if (!_.isEqual(now[attr], val)) {
      now[attr] = val;
      // ...
      if (!options.silent) this.trigger('change:' + attr, this, val, options);
    }
  }

  // Fire the `"change"` event, if the model has been changed.
  if (!alreadyChanging && !options.silent && this._changed) this.change(options);

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

Для полноты я должен упомянуть, что в документации по интерфейсу для Model#set не указывается какое-либо конкретное поведение в отношении того, когда будут инициированы отдельные события изменения, а только сказано, что они будут инициированы.

...