从Marionette模块中创建子模块的最佳方法是什么?

时间:2015-02-26 21:43:19

标签: javascript design-patterns backbone.js marionette

我正在构建一个可以包含多个模块的应用程序(有些模块甚至可以包含子模块)。在实例化应用程序时,我传入一个对象,该对象描述了我想要为该应用程序实例(myApp)激活的模块,以及这些模块应该使用的类。然后,应用程序使用工厂对象来创建必要的模块。这很好地作为概念证明,但是我在从其他模块中创建子模块时遇到麻烦,初始化方法并启动这些子模块

使用下面的代码,我看到以下消息被转储到控制台(添加的数字供参考)。

  1. (Some.Module.Class)moduleA初始化
  2. (Some.Module.Class)moduleB初始化
  3. (Some.SubModule.Class)moduleB初始化
  4. (Some.SubModule.Class)子模块B初始化
  5. (Some.Module.Class)moduleA start
  6. (Some.Module.Class)moduleB start
  7. 令我困惑的是 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();
    

0 个答案:

没有答案