#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?