Questo potrebbe essere già stato chiesto un sacco di volte, e ho cercato in giro SO ma finora tutte le risposte che ho letto non sono esattamente quello che sto cercando.Modello di disegno JavaScript letterale o modulare
Sto lavorando a un sito Web con elementi DOM moderati che mostrano/nascondono, alcune chiamate AJAX e probabilmente qualcos'altro. Così sarò avendo due file principali di script (standard HTML5 Boilerplate)
plugins.js // third party plugins here
site.js // all my site specific code here
precedenza che sto usando modello oggetto di design letterale, quindi il mio site.js
è qualcosa di simile:
var site = {
version: '0.1',
init: function() {
site.registerEvents();
},
registerEvents: function() {
$('.back-to-top').on('click', site.scrollToTop);
},
scrollToTop: function() {
$('body').animate({scrollTop: 0}, 400);
}
};
$(function() {
site.init();
});
Fin qui tutto buono, è ben leggibile, tutti i metodi sono pubblici (mi piace un po ', dato che posso testarli direttamente tramite Chrome Dev Tools se necessario). Tuttavia, ho intenzione di separare alcune delle funzionalità del sito in stile più modulare, quindi voglio avere qualcosa di simile sotto il codice di cui sopra (o in file separati):
site.auth = {
init: function() {
site.auth.doms.loginButton.on('click', site.auth.events.onLoginButtonClicked);
},
doms: {
loginButton: $('.login'),
registerButton: $('.register')
},
events: {
onLoginButtonClicked: function() {
}
},
fbLogin: function() {
}
};
site.dashboard = {
};
site.quiz = {
};
// more modules
Come si può vedere, molto è leggibile. Tuttavia c'è uno svantaggio evidente, che è che devo scrivere il codice come site.auth.doms.loginButton
e site.auth.events.onLoginButtonClicked
. Improvvisamente diventa difficile da leggere, e crescerà solo più a lungo, più diventa complessa la funzionalità. Poi ho provato il modello modulare:
var site = (function() {
function init() {
$('.back-to-top').on('click', scrollToTop);
site.auth.init();
}
function scrollToTop() {
$('body').animate({scrollTop: 0}, 400);
}
return {
init: init
}
})();
site.auth = (function() {
var doms = {
loginButton: $('.login'),
registerButton: $('.register')
};
function init() {
doms.loginButton.on('click', onLoginButtonClicked);
}
function onLoginButtonClicked() {
}
return {
init: init
}
})();
// more modules
Come si può vedere, i nomi lunghi non ci sono più, ma poi penso che devo a init tutti gli altri moduli nella funzione site.init() per la costruzione di tutti? Quindi devo ricordare di restituire le funzioni che devono essere accessibili da altri moduli. Entrambi sono a posto, credo che sia un po 'complicato, ma nel complesso, sto lavorando su un flusso di lavoro migliore con pattern modulari?
E riguardo 'this.doms.loginButton.on ('clic', this.events.onLoginButtonClicked);'? – Bergi
Potrebbe funzionare, non posso credere di non averlo provato. Ma è ancora abbastanza lungo da scrivere rispetto al modello modulare. – Henson