frontend-park-mail-ru / 2020_1_Failless

Фронтенд репозиторий команды Failless
2 stars 1 forks source link

[UTILS] Add save/remove functionality of event handlers for each controller #44

Closed almashell closed 4 years ago

almashell commented 4 years ago

Issue

При создании новой страницы и, как следствие, нового контроллера появляются новые функциональные элементы (кнопки, inputs, формы итд). Для подобных элементов обязательно будут добавлены обработчики событий (click, submit, focus, blur...):

addEventListener(event, handler);

Однако ранее не существовало соответствующей операции отвязки:

removeEventListener(event, handler);

Solution

В базовый класс Controller были добавлены 2 новые функции и 1 свойство:

this.eventHandlers = [];
...
addEventHandler = (node, event, handler) => {...}
removeEventHandler = (node, event) => {...}

Структура хранения функциональных элементов и событий обощенно выглядит так:

    [{
      htmlNode: домэлемент,
      events: [{
            event: 'click',
            handler: callback
      }]
    }]

Теперь из производного класса в моменты операции связывания функционального элемента и его обработчика достаточно вызвать:

this.addEventHandler(this.form, 'submit', this.#loginSubmitHandler);

При переключении на новую страницу старый контроллер будет уничжен с вызовом соотвествующего деструктора, в котором итерационно будут уничтожены все обработчки вызовом:

    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).

egogoger commented 4 years ago

Добавь описание, зачем это нужно

almashell commented 4 years ago

Добавь описание, зачем это нужно

Обновил описание PR.

egogoger commented 4 years ago

Огонь огненный

almashell commented 4 years ago

@EgorBedov проверь по диагонали работоспособность обработчиков на своих страницах!