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实现模块化。