Я хочу использовать две render
функции для рендеринга двух классов.
class SidebarView {
constructor(model, root) {
this.root = root;
this.model = model;
model.addObserver(x => this.update(x));
}
render() {
this.root.innerHTML = `<span>${this.model.getNumberOfGuests()}</span>`;
}
update(whatHappened) {
this.root.secondElementChild.textContent = whatHappened.guests;
}
}
class SummaryView {
constructor(model, root) {
this.root = root;
this.model = model;
model.addObserver(x => this.update(x));
}
render() {
this.root.innerHTML = `Dinner for <span>${this.model.getNumberOfGuests()}</span> people`;
}
update(whatHappened) {
this.root.firstElementChild.textContent = whatHappened.guests;
}
}
class DinnerModel {
constructor() {
this.numberOfGuests = 2;
this.subscribers = [];
}
setNumberOfGuests(x) {
this.numberOfGuests = x;
this.notifyObservers({
guests: x
});
return x
// TODO TW1.1
}
getNumberOfGuests() {
return this.numberOfGuests // TODO TW1.1
}
addObserver(callback) {
this.subscribers.push(callback);
console.log(this.subscribers)
}
notifyObservers(whatHappened) {
for (let i = 0; i < this.subscribers.length; i++) {
return this.subscribers[i](whatHappened)
}
}
}
const model = new DinnerModel();
new SummaryView(model, document.body.querySelector("#summary")).render();
new SidebarView(model, document.body.querySelector("#sidebar")).render();
function onModelChange(payload) {
document.body.textContent = payload.guests;
}
model.addObserver(onModelChange);
Эти коды почти одинаковы, но хорошо работает только Summary, я не знаю почему.
Я вижу номер 2 в браузере, но для боковой панели я не могу изменить номер через консоль. Только резюме может изменить число через консоль.
Заранее спасибо. Поскольку я начинающий с Javascript, это может быть глупый вопрос.