Sto cercando di capire un modo per risolvere il seguente problema di dipendenza.
Ho un oggetto genitore DomManager
che ha la responsabilità di gestire tutte le interazioni con il DOM. Inizializza diversi moduli e due sono dipendenti l'uno dall'altro: PlayerDom
e Sticky
.
Ad un certo punto, il metodo di PlayerDom
deve chiamare un metodo di Sticky
(e viceversa).
Dopo diverse iterazioni, ho trovato la seguente implementazione:
DomManager
var DomManager = {
// General configuration
config: null,
// Modules container
modules: {},
/**
* Initialization function
*
* @param config - Configuration object
* @returns {DomManager} - DomManager object
*/
init: function(config) {
this.config = this.setConfig(config);
this.initModules();
return this;
},
setConfig: function(config) {
return config;
},
/**
* Invoke a service from a particular module
*
* @param moduleName - Module name
* @param service - Method name to be invoked
* @param args - Optional method parameters
*/
invoke: function(moduleName, service, args) {
if (this.modules[moduleName] && typeof this.module[moduleName][service] === 'function') {
this.modules[moduleName][service](args);
}
},
/**
* Initializes all modules it depends on
*/
initModules: function() {
// Initialize player DOM manager
this.modules['playerDom'] = PlayerDom.init(this.config.playerDom);
// Stickiness is NOT enabled on videogallery
if (this.config.sticky.enabled) {
this.modules['sticky'] = Sticky.init(this.config.sticky);
}
// Top leaderboard stickiness is enabled only on mobile
if (this.config.topLeaderBoard.enabled) {
this.modules['topleaderboard'] = TopLeaderBoard.init(this.config.topLeaderBoard);
}
// Read more is enabled only if the following conditions are met:
// - Template A
// - One of: Facebook Referrer, Mobile, Tablet
if (this.config.readMore.enabled) {
this.modules['readMore'] = ReadMore.init(this.config.readMore);
}
}
};
Quindi quando PlayerDom
deve chiamare un servizio di Sticky
, deve chiamare, ad esempio, DomManager.invoke('sticky', 'enable')
.
Potrebbe essere una buona soluzione o c'è qualcosa di meglio?