不幸的是,我在理解 Backbone.Marionette 模块和子模块的启动时遇到了问题。初始化器被多次调用,而不是每次被调用一次。
我需要做什么才能使事情以可预见的方式工作?
PP = new Backbone.Marionette.Application();
PP.bind('start', function() {
console.log('application start');
PP.module('Routing').start();
PP.module('Products').start();
});
PP.module('Routing', {
startWithApp: false,
define: function(Routing, PP, Backbone, Marionette, $, _) {
Routing.addInitializer(function() {
console.log('Routing.init');
});
}
});
PP.module('Routing.ProductsRouting', {
startWithApp: false,
define: function(ProductsRouting, PP, Backbone, Marionette, $, _) {
ProductsRouting.addInitializer(function() {
console.log('ProductsRouting.init');
});
}
});
PP.module('Products', {
startWithApp: false,
define: function(Products, PP, Backbone, Marionette, $, _) {
Products.addInitializer(function() {
console.log('Products.init');
});
}
});
$(function() {
PP.start();
});
(代码也可用作JSFiddle)
上面的代码在控制台中输出以下行:
- 应用程序启动
- 路由.init
- ProductsRouting.init
- 路由.init
- ProductsRouting.init
- 产品.init
- 产品.init
这就是我所期望的:
- 应用程序启动
- 路由.init
- 产品.init
如果您决定使用您的应用程序自动启动所有模块(所有模块中的 startWithApp: true 并且无需手动启动 Routing 和 Products 模块),则输出是这样的:
- 路由.init
- ProductsRouting.init
- ProductsRouting.init
- 产品.init
- 应用程序启动