Javascript 什么';从木偶中的模块内部创建子模块的最佳方法是什么?

Javascript 什么';从木偶中的模块内部创建子模块的最佳方法是什么?,javascript,design-patterns,backbone.js,marionette,Javascript,Design Patterns,Backbone.js,Marionette,我正在构建一个可以由多个模块组成的应用程序(有些模块甚至会有子模块)。当应用程序被实例化时,我传入一个对象,该对象描述我希望为该应用程序实例(myApp)激活的模块,以及这些模块应该使用的类。然后,应用程序使用factory对象创建必要的模块。这是一个很好的概念证明,但是在从其他模块初始化方法中创建子模块并启动这些子模块时,我遇到了麻烦 使用下面的代码,我看到以下消息转储到控制台(添加数字以供参考) (Some.Module.Class)模块A初始化 (Some.Module.Class)模块B

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

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

  • (Some.Module.Class)模块A初始化
  • (Some.Module.Class)模块B初始化
  • (Some.SubModule.Class)模块B初始化
  • (Some.SubModule.Class)子模块B初始化
  • (Some.Module.Class)模块A启动
  • (Some.Module.Class)模块B启动
  • 让我困惑的是 1.调用moduleB的onStart方法时,子模块为空,并且没有子moduleB不启动。 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();
    

    这可能不是你想听到的,但提线木偶的创造者德里克·贝利(Derick Bailey)将模块系统称为“一团可怕的烂摊子”。也许您最好使用诸如requirejs或browserify之类的工具来定义模块。的确根本不是我想听的。不幸的是,我打算将模块用作可以启动/停止并绑定到事件系统中的子应用程序,而不仅仅是构建过程的资源。听起来browserify并不能解决这个问题。谢谢你的提醒。要做到这一点可能并不难,只是让我质疑我现在使用木偶的选择。我已经在一个相当大的应用程序上使用木偶一段时间了,发现它非常好,主要用于布局视图、集合视图和复合视图。一开始我试着使用模块系统,但我个人发现它很复杂,很强迫,从实现模块到停止/启动模块。有没有其他方法来处理缺少子应用的问题?我看到他们在谈论第三版,但谁知道什么时候会出现呢。谢谢您的回复,顺便说一句。非常感谢。@fugged您可能想看看,它旨在解决subapp的许多问题,并提供集中但解耦的通信、依赖项注入等。它也可以很好地与木偶配合使用,并用于require/browserify。免责声明:我是合著者。