При создании новой страницы и, как следствие, нового контроллера появляются новые функциональные элементы (кнопки, inputs, формы итд).
Для подобных элементов обязательно будут добавлены обработчики событий (click, submit, focus, blur...):
addEventListener(event, handler);
Однако ранее не существовало соответствующей операции отвязки:
removeEventListener(event, handler);
Solution
В базовый класс Controller были добавлены 2 новые функции и 1 свойство:
При переключении на новую страницу старый контроллер будет уничжен с вызовом соотвествующего деструктора, в котором итерационно будут уничтожены все обработчки вызовом:
destructor() {
if (this.eventHandlers.length !== 0) {
for (const nodeVal of this.eventHandlers) {
for (const eventVal of nodeVal.events) {
this.removeEventHandler(nodeVal.htmlNode, eventVal.event);
}
}
}
this.parent.innerHTML = '';
}
Additional comments
Если вы используете стрелочные функции, то вы сразу определяете контекст их выполнения на окружающий scope, которым является класс, что избавляет вас от необходимости постоянно делать .bind(this).
Issue
При создании новой страницы и, как следствие, нового контроллера появляются новые функциональные элементы (кнопки, inputs, формы итд). Для подобных элементов обязательно будут добавлены обработчики событий (
click
,submit
,focus
,blur
...):Однако ранее не существовало соответствующей операции отвязки:
Solution
В базовый класс
Controller
были добавлены 2 новые функции и 1 свойство:Структура хранения функциональных элементов и событий обощенно выглядит так:
Теперь из производного класса в моменты операции связывания функционального элемента и его обработчика достаточно вызвать:
При переключении на новую страницу старый контроллер будет уничжен с вызовом соотвествующего деструктора, в котором итерационно будут уничтожены все обработчки вызовом:
Additional comments
Если вы используете стрелочные функции, то вы сразу определяете контекст их выполнения на окружающий scope, которым является класс, что избавляет вас от необходимости постоянно делать
.bind(this)
.