store active js util instances to be able to easier destroy them
This commit is contained in:
parent
e0c7edc1ca
commit
010718dfab
@ -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];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
Reference in New Issue
Block a user