I have an application with three pages (which are single-page interfaces). The pages have similar but not identical functionality.
So I want to have javascript-modules that provide the common functionality. Then each page may customize/overwrite parts of the common functionality.
I'm using backbone.js, so what I do is:
- load the files containing the common Models, Views, Collections etc.
- load app-specific files that customize/overwrite parts of step 1
- call an init() function that instanciates all necessary Models/Views/Collections
At the moment I store my modules in a module-container similar to this: https://stackoverflow.com/a/9426071 Each module has an optional init() function that is executed by my main init() function.
Example:
I have a file called results.js. It defines the common Model/Collection/View of search-results. In its init() function everything is instanciated, but this function is not yet called:
var resultView = new ResultView()
Then I include myApp.js, and parts of the View are overwritten.
- The main init() function calls results.js init() which instanciates the new View. Everything works nice, smooth and DRY.
Now I want to switch to require.js instead of my own module-container, and wonder how to organize my code.
I could either instanciate all models/views etc. in myApp.js instead of the init() function of each module. This would mean to have a lot of repetitive code.
Or I could stick to each module having its init() function, and call those init() functions in myApp.js. I don't like this because I would have to explicitly write down my modules three times for each of my three pages:
require(['module1', 'module2', 'module3', ...],
function(module1, module2, module3, ...) {
var init = function() {
module1.init();
module2.init();
module3.init();
...
}
return {init: init};
}
);
For 10 modules plus a number of libraries this is not nice and DRY. Is there any way to access (loop over) all modules that require.js holds?
Or am I missing something, should I structure my code in a different way?
Any hints/thoughts are welcome,
Michael
arguments
in your callback and callinginit()
if it exists? – chrisfrancis27arguments
exactly? If you mean this:function(module1, module2, module3, ...) {
How can I loop over them without naming them explicitly? – Michaelarguments
object is a built-in property offunction
, it's an array of all arguments passed to the function. In the case of require.js, you know that the arguments received will exactly match the module definitions you supplied as dependencies. – chrisfrancis27arguments
seems like a very basic thing, I wonder how I never read about it up to now. This way I can even just expliclitly name the modules once, excellent. – Michael