我正在构建一个可以包含多个模块的应用程序(有些模块甚至可以包含子模块)。在实例化应用程序时,我传入一个对象,该对象描述了我想要为该应用程序实例(myApp)激活的模块,以及这些模块应该使用的类。然后,应用程序使用工厂对象来创建必要的模块。这很好地作为概念证明,但是我在从其他模块中创建子模块时遇到麻烦,初始化方法并启动这些子模块。
使用下面的代码,我看到以下消息被转储到控制台(添加的数字供参考)。
令我困惑的是 1.当调用moduleB的onStart方法时,子模块为空,并且没有子模块B不启动。 2.为什么控制台消息中出现第3行?它调用moduleB初始化两次,但使用子模块类?
//SUB MODULE
Some.SubModule.Class = Io.Modules.BaseModule.extend({
__className: "Some.SubModule.Class",
startWithParent: false,
onStart: function(options) {
console.log("(", this.getClassName(), ")", this.moduleName, "start");
},
initialize: function(options, moduleName, app) {
console.log("(", this.getClassName(), ")", this.moduleName, "initialize");
}
});
// MODULE
Some.Module.Class = Io.Modules.BaseModule.extend({
__className: "Some.Module.Class",
startWithParent: false,
onStart: function(options) {
console.log("(", this.getClassName(), ")", this.moduleName, "start");
_.each(this.submodules, function(module) { module.start(); });
},
initialize: function(moduleName, app, options) {
console.log("(", this.getClassName(), ")", this.moduleName, "initialize");
var moduleFactory = new Io.Factories.ModuleFactory({app:app});
var fieldConfigurator = moduleFactory.createModule("moduleB.submoduleB", Some.SubModule.Class, {});
}
});
// APPLICATION
var MyApp = Marionette.Application.extend({
...
initialize: function(opts) {
//Create all modules described in the options passed in
}
//Start up all modules
_.each(this.submodules, function(module) { module.start(); });
...
});
var myApp = new MyApp({
modules: {
moduleA: {
"class":Some.Module.Class,
options:{
someOption:someValue
}
},
moduleB: {
"class":Some.Module.Class,
options:{
someOption:someValue
}
},
...
}
});
myApp.start();