HM-31. Добавлен роутинг для страниц (#9)

This commit is contained in:
Nikolay
2020-07-14 20:18:49 +03:00
committed by GitHub
parent 521a80c1e3
commit 4ab8b1e273
15 changed files with 197 additions and 52 deletions

View File

@ -1,21 +1,17 @@
import EmitService from '../../services/EmitService';
/**
* Класс для создания компонентов приложения. Необходим для наследования.
* @param {string} mainNodeSelector - селектор, с помощью которого извлекается шаблон компонента
* @param {Node} parentNode - родительский Node, в который следует положить созданный элемент
*/
class Component {
class Component extends EmitService {
/**
* Список слушателей компонента
* @type {{element: Node, eventName: string, listener: Function}[]}
*/
_listeners;
/**
* События компонента
* @type {Object<string, Function[]>}
*/
_events;
/**
* Корневой элемент компонента
* @type {Node} - корневой элемент компонента
@ -23,6 +19,7 @@ class Component {
mainNode;
constructor (mainNodeSelector, parentNode) {
super();
const content = document.querySelector(mainNodeSelector).content;
if (content.children.length > 1) {
const message = '<template> должен содержать только один элемент children';
@ -45,31 +42,6 @@ class Component {
this._listeners.push({element, eventName, listener});
}
/**
* Метод подписки на события компонента
* @param {string} eventName - событие компонента, на которое будет реагировать обработчик
* @param {Function} listener - обработчик события
*/
subscribe = (eventName, listener) => {
const listeners = this._events[eventName] || [];
this._events[eventName] = [
...listeners,
listener,
];
}
/**
* Метод генерирует событие
* @param {string} eventName - событие, которое необходимо сгенерировать
* @param {unknown[]} args - аругемнты, который необходимо передать обработчикам события
*/
next = (eventName, ...args) => {
const listeners = this._events[eventName];
listeners.forEach((listener) => {
listener(...args);
});
}
/**
* Метод уничтожения компонента. Удаляет элемент из верстки, снимает обработчики и очищает подписки
*/
@ -79,7 +51,7 @@ class Component {
});
this.mainNode.remove();
this._listeners = [];
this._events = {};
this.clearSubscribes();
}
}