store active js util instances to be able to easier destroy them

This commit is contained in:
Felix Hamann 2019-03-03 23:18:26 +01:00
parent e0c7edc1ca
commit 010718dfab

View File

@ -4,6 +4,7 @@
window.utils = window.utils || {}; window.utils = window.utils || {};
var registeredSetupListeners = {}; var registeredSetupListeners = {};
var activeInstances = {};
/** /**
* setup function to initiate a util (utilName) on a scope (sope) with options (options). * setup function to initiate a util (utilName) on a scope (sope) with options (options).
@ -13,20 +14,33 @@
*/ */
window.utils.setup = function(utilName, scope, options) { window.utils.setup = function(utilName, scope, options) {
var utilInstance;
if (!utilName || !scope) { if (!utilName || !scope) {
return; return;
} }
options = options || {}; options = options || {};
var utilInstance;
// i18n // i18n
if (window.I18N) { if (window.I18N) {
options.i18n = window.I18N; options.i18n = window.I18N;
} }
if (activeInstances[utilName]) {
var instanceWithSameScope = activeInstances[utilName]
.filter(function(instance) { return !!instance; })
.find(function(instance) {
return instance.scope === scope;
});
var isAlreadySetup = !!instanceWithSameScope;
if (isAlreadySetup) {
console.warn('Trying to setup a JS utility that\'s already been set up', { utility: utilName, scope, options });
}
}
function setup() {
var listener = function(event) { var listener = function(event) {
if (event.detail.targetUtil !== utilName) { if (event.detail.targetUtil !== utilName) {
@ -42,15 +56,25 @@
} }
utilInstance = util(scope, options); utilInstance = util(scope, options);
}
if (utilInstance) {
if (activeInstances[utilName] && Array.isArray(activeInstances[utilName])) {
activeInstances[utilName].push(utilInstance);
} else {
activeInstances[utilName] = [ utilInstance ];
}
} }
}; };
if (registeredSetupListeners[utilName] && Array.isArray(registeredSetupListeners[utilName])) {
window.utils.teardown(utilName); window.utils.teardown(utilName);
if (registeredSetupListeners[utilName] && !options.singleton) { }
if (!registeredSetupListeners[utilName] || Array.isArray(registeredSetupListeners[utilName])) {
registeredSetupListeners[utilName] = [];
}
registeredSetupListeners[utilName].push(listener); registeredSetupListeners[utilName].push(listener);
} else {
registeredSetupListeners[utilName] = [ listener ];
}
document.addEventListener('setup', listener); document.addEventListener('setup', listener);
@ -59,16 +83,32 @@
bubbles: true, bubbles: true,
cancelable: true, cancelable: true,
})); }));
}
setup();
return utilInstance; return utilInstance;
}; };
window.utils.teardown = function(utilName) {
window.utils.teardown = function(utilName, destroy) {
if (registeredSetupListeners[utilName]) { if (registeredSetupListeners[utilName]) {
registeredSetupListeners[utilName].forEach(function(listener) { registeredSetupListeners[utilName]
.filter(function(listener) { return !!listener })
.forEach(function(listener) {
document.removeEventListener('setup', listener); document.removeEventListener('setup', listener);
}); });
delete registeredSetupListeners[utilName]; delete registeredSetupListeners[utilName];
} }
if (destroy === true && activeInstances[utilName]) {
activeInstances[utilName]
.filter(function(instance) { return !!instance })
.forEach(function(instance) {
console.log({ instance });
instance.destroy();
});
delete activeInstances[utilName];
}
} }
})(); })();