不幸的是,我在理解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)
上面的代码在控制台中输出这一行:
这就是我的预期:
如果您决定使用您的应用程序自动启动所有模块(startWithApp:在所有模块中都为true,而无需手动启动路由和产品模块),则输出为:
答案 0 :(得分:3)
这是固定的w / v0.9.7 https://github.com/derickbailey/backbone.marionette/blob/master/changelog.md#v097-view-commit-logs
答案 1 :(得分:2)
通过在Backbone.Marionette上实现此github pull request来解决问题。但也许Derick Bailey(Backbone.Marionette的创造者)对此有自己的看法?
答案 2 :(得分:0)
如果任何人仍然遇到模块似乎加载错误顺序的问题 - 我的解决方案是Backbone.history.start()
的位置。
这是我的问题:
<强> bootstrap.js 强>
App.start();
<强> App.js 强>
App = new Backbone.Marionette.Application();
var _AppRouter = Backbone.AppRouter.extend({
appRoutes: {
"" : "getStarted"
},
controller: App
});
App.getStarted = function() {
console.log(App.MyModule.myMethod); // undefined
App.MyModule.myMethod();
}
App.addInitializer(function() {
new _AppRouter();
Backbone.history.start();
});
<强> App.MyModule.js 强>
App.module("MyModule", function(MyModule, App) {
MyModule.myMethod = function() {
console.log("in myMethod"); // never gets called
}
});
在此示例中未定义App.MyModule.myMethod,因此应用程序启动时没有任何反应。
我发现这个问题是我打电话Backbone.history.start()
的地方。我把这个调用移到了我的bootstrap.js文件中,所以我只是在我的所有app模块都已正确初始化后才调用我的路径。
<强> bootstrap.js 强>
App.start();
Backbone.history.start();
容易豌豆。