1

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

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

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

var app = new SuperApplication();

虽然我一直在开发,但偶尔创建一个新Application实例并.module在应用程序对象变得有用之前多次调用变得很重要。它会对创建的每个对象的测试可靠性产生负面影响Application,因为不能保证它们具有相同的原型。

以下方法,虽然丑陋,但无法正确地将模块定义附加到Application原型:

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);
    }
});

我应该以其他方式做到这一点吗?

4

1 回答 1

2

编辑:木偶模块现已弃用,将在下一个主要版本中删除

请改用ES6/CommonJS/AMD 模块。可以使用原型继承组合在 vanilla JavaScript 中实现能力共享。


原始答案(Marionette pre 2.0)

你是对的,你不能创建这样的模块;你必须使用App.module()模式。

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

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();

如果您希望多个模块具有相似的功能(或具有相同的初始定义),module可以使用相同的模块名称多次调用该方法以更改功能。这可以用来创建一种base module可以扩展的类型:

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();
于 2013-09-19T05:39:50.173 回答