chore(asidenav): implemented destroy in asidenav.js
This commit is contained in:
parent
4812db6c87
commit
a25b59b318
@ -4,6 +4,7 @@ export const EVENT_TYPE = {
|
||||
KEYDOWN : 'keydown',
|
||||
INVALID : 'invalid',
|
||||
CHANGE : 'change',
|
||||
MOUSE_OVER : 'mouseover',
|
||||
//more to be added
|
||||
};
|
||||
|
||||
@ -20,7 +21,7 @@ export class EventManager {
|
||||
registerNewListener(eventWrapper) {
|
||||
this._debugLog('registerNewListener', eventWrapper);
|
||||
let element = eventWrapper.element;
|
||||
element.addEventListener(eventWrapper.eventType, eventWrapper.eventHandler);
|
||||
element.addEventListener(eventWrapper.eventType, eventWrapper.eventHandler, eventWrapper.options);
|
||||
this._registeredListeners.push(eventWrapper);
|
||||
}
|
||||
|
||||
@ -45,14 +46,16 @@ export class EventWrapper {
|
||||
_eventType;
|
||||
_eventHandler;
|
||||
_element;
|
||||
_options
|
||||
|
||||
constructor(_eventType, _eventHandler, _element) {
|
||||
constructor(_eventType, _eventHandler, _element, _options) {
|
||||
if(!_eventType || !_eventHandler || !_element) {
|
||||
throw new Error('Not enough arguments!');
|
||||
}
|
||||
this._eventType = _eventType;
|
||||
this._eventHandler = _eventHandler;
|
||||
this._element = _element;
|
||||
this._options = _options;
|
||||
}
|
||||
|
||||
get eventType() {
|
||||
@ -66,4 +69,8 @@ export class EventWrapper {
|
||||
get element() {
|
||||
return this._element;
|
||||
}
|
||||
|
||||
get options() {
|
||||
return this._options;
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
import { Utility } from '../../core/utility';
|
||||
import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager';
|
||||
import './asidenav.sass';
|
||||
|
||||
const FAVORITES_BTN_CLASS = 'navbar__list-item--favorite';
|
||||
@ -15,6 +16,7 @@ export class Asidenav {
|
||||
|
||||
_element;
|
||||
_asidenavSubmenus;
|
||||
_eventManager;
|
||||
|
||||
constructor(element) {
|
||||
if (!element) {
|
||||
@ -23,6 +25,8 @@ export class Asidenav {
|
||||
|
||||
this._element = element;
|
||||
|
||||
this._eventManager = new EventManager();
|
||||
|
||||
if (this._element.classList.contains(ASIDENAV_INITIALIZED_CLASS)) {
|
||||
return false;
|
||||
}
|
||||
@ -35,19 +39,24 @@ export class Asidenav {
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._asidenavSubmenus.forEach((union) => {
|
||||
union.listItem.removeEventListener(union.hoverHandler);
|
||||
});
|
||||
|
||||
this._eventManager.removeAllEventListenersFromUtil();
|
||||
|
||||
if(this._element.classList.contains(ASIDENAV_INITIALIZED_CLASS))
|
||||
this._element.classList.remove(ASIDENAV_INITIALIZED_CLASS);
|
||||
}
|
||||
|
||||
_initFavoritesButton() {
|
||||
const favoritesBtn = document.querySelector('.' + FAVORITES_BTN_CLASS);
|
||||
if (favoritesBtn) {
|
||||
favoritesBtn.addEventListener('click', (event) => {
|
||||
|
||||
const favoritesButtonEvent = new EventWrapper(EVENT_TYPE.CLICK, (event) => {
|
||||
favoritesBtn.classList.toggle(FAVORITES_BTN_ACTIVE_CLASS);
|
||||
this._element.classList.toggle(ASIDENAV_EXPANDED_CLASS);
|
||||
event.preventDefault();
|
||||
}, true);
|
||||
}, favoritesBtn, true);
|
||||
|
||||
this._eventManager.registerNewListener(favoritesButtonEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@ -62,7 +71,8 @@ export class Asidenav {
|
||||
|
||||
this._asidenavSubmenus.forEach((union) => {
|
||||
union.hoverHandler = this._createMouseoverHandler(union);
|
||||
union.listItem.addEventListener('mouseover', union.hoverHandler);
|
||||
let currentHoverEvent = new EventWrapper(EVENT_TYPE.MOUSE_OVER, union.hoverHandler, union.listItem);
|
||||
this._eventManager.registerNewListener(currentHoverEvent);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { Asidenav } from './asidenav';
|
||||
import { Asidenav, ASIDENAV_INITIALIZED_CLASS } from './asidenav';
|
||||
|
||||
describe('Asidenav', () => {
|
||||
|
||||
@ -13,6 +13,12 @@ describe('Asidenav', () => {
|
||||
expect(asidenav).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should destory asidenav', () => {
|
||||
asidenav.destroy();
|
||||
expect(asidenav._eventManager._registeredListeners.length).toBe(0);
|
||||
expect(asidenav._element.classList).not.toContain(ASIDENAV_INITIALIZED_CLASS);
|
||||
});
|
||||
|
||||
it('should throw if called without an element', () => {
|
||||
expect(() => {
|
||||
new Asidenav();
|
||||
|
||||
Reference in New Issue
Block a user