Зависимые атрибуты в Backbone.js модель

#javascript #model-view-controller #backbone.js

#javascript #модель-представление-контроллер #backbone.js

Вопрос:

Если одно из двух значений — a или b — изменяется в моей модели, двум прослушивающим представлениям необходимо вычислить третье значение c .

 //Pseudo 
mainModel 
  a : 2000 
  b : 3000

view1 
helper.calculateC(this.model.get(a), this.model.get(b)) 

view2 
helper.calculateC(this.model.get(a), this.model.get(b)) 
  

Я бы предпочел поместить зависимый атрибут c в модель (поскольку
вычисление довольно сложное, и «c» позже может быть разрешено
переопределять пользователем.) Что такое хорошая практика? Должен ли я расширить
модель, создать подмодель или что?

Спасибо!

Ответ №1:

Вы можете добавить привязку модели к ее собственному событию изменения при вызове initialize .

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

calculateC: function() {
  this.c = //fill in the blanks
}    
  

Более конкретно, вы можете привязывать только те атрибуты, которые вам нужны.

   this.bind("change:a", this.calculateC);
  this.bind("change:b", this.calculateC);
  

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

1. Но тогда C не будет вычисляться до событий изменения модели? Следовательно, представления не будут иметь доступа к последнему значению c. Или вы имеете в виду, что модель может вычислить это, прежде чем каким-то образом запускать события изменения? Спасибо.

2. Кажется, что вышеприведенное работает 🙂 Но я не могу понять, как модель уведомляется перед представлениями? (И: если я хочу установить «c» в качестве атрибута модели и запустить для него события изменения, что мне делать?) Спасибо!

3. Вы получаете событие первым, потому что вы первый, кто подключил событие изменения к себе. Initialize вызывается в конструкторе, поэтому вы знаете, что вы первый, кто его подключил…

4. Спасибо! Продолжение: 1) Каков хороший способ предотвратить повторное вычисление c, если оба a и b изменены? 2) Если c является атрибутом модели, могу ли я заставить его запускать событие изменения ВМЕСТЕ с a amp; b?