Backbone.js 用模块定义扩展木偶应用程序

Backbone.js 用模块定义扩展木偶应用程序,backbone.js,marionette,Backbone.js,Marionette,我一直在使用木偶网编写我的应用程序,但我对应用程序扩展失败感到有点困惑 在木偶中似乎没有办法做这种事情: var SuperApplication = Backbone.Marionette.Application.extend({ 'modules': { 'foo': function (module, app) { // module definition }, 'bar': function (module,

我一直在使用木偶网编写我的应用程序,但我对应用程序扩展失败感到有点困惑

在木偶中似乎没有办法做这种事情:

var SuperApplication = Backbone.Marionette.Application.extend({
    'modules': {
        'foo': function (module, app) {
            // module definition
        },
        'bar': function (module, app) {
            // module definition
        }
    }
});

var app = new SuperApplication();
在开发过程中,偶尔创建一个新的
应用程序
实例并多次调用
.module
,然后应用程序对象才会变得有用,这一点变得非常重要。它会对创建的每个
应用程序
对象的测试可靠性产生负面影响,因为无法保证它们是同一原型

以下方法虽然丑陋,但无法将模块定义作为原型正确附加到
应用程序

SecondApplication = Backbone.Marionette.Application.extend({
    'foo': function () {
        var args = slice(arguments);
        args.unshift(this);
        args.push(function (module, app) {
            // module definition
        });
        return Backbone.Marionette.Module.create.apply(
            Backbone.Marionette.Module, args);
    }
});
我是否应该用其他方法来完成此操作?

编辑: 改用。可以使用或在普通JavaScript中实现功能共享。

原始答案(木偶2.0之前) 你是对的,你不能创建这样的模块;您必须使用
App.module()
模式

创建多个应用程序实例是不寻常的。典型的设置有一个
应用程序
实例,其中包含
模块
和子
模块
,用于将站点划分为逻辑区域,如下所示:

var MyApp = new Marionette.Application();

MyApp.module('forums', function(mod, app) {});
MyApp.module('gallery', function(mod, app) {});
MyApp.module('gallery.kitchen', function(mod, app) {});
MyApp.module('gallery.diningroom', function(mod, app) {});

MyApp.start();
如果希望多个模块具有相似的功能(或具有相同的初始定义),可以使用相同的模块名称多次调用
模块
方法来更改功能。这可用于创建可扩展的
基本模块

var MyApp = new Marionette.Application();

// Create your shared definition:
var ModuleDefaults = { definition: function(mod, app) {
  mod.type = 'gallery';
  mod.addInitializer(function() { /* do work */ });
}};
// create your modules (quickly!)
_.each(['forums', 'gallery', 'gallery.kitchen', 'gallery.master'],
  function(moduleName) {
    MyApp.module(moduleName, ModuleDefaults.definition);
});

// override whatever your want:
MyApp.module('forums', function(mod, app) {
  mod.type = 'forum';
  mod.addFinalizer(function() { /* take out the papers and the trash */ });
});

MyApp.start();
看起来现在不推荐使用。文档建议使用AMD/CommonJS/ES6实现模块化。