应用程序启动和Backbone.Marionette模块的问题

时间:2012-08-06 18:11:30

标签: backbone.js marionette

不幸的是,我在理解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

上面的代码在控制台中输出这一行:

  • 申请开始
  • Routing.init
  • ProductsRou​​ting.init
  • Routing.init
  • ProductsRou​​ting.init
  • Products.init
  • Products.init

这就是我的预期:

  • 申请开始
  • Routing.init
  • Products.init

如果您决定使用您的应用程序自动启动所有模块(startWithApp:在所有模块中都为true,而无需手动启动路由和产品模块),则输出为:

  • Routing.init
  • ProductsRou​​ting.init
  • ProductsRou​​ting.init
  • Products.init
  • 申请开始

3 个答案:

答案 0 :(得分:3)

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

容易豌豆。