0

不幸的是,我在理解 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
  • ProductsRou​​ting.init
  • 路由.init
  • ProductsRou​​ting.init
  • 产品.init
  • 产品.init

这就是我所期望的:

  • 应用程序启动
  • 路由.init
  • 产品.init

如果您决定使用您的应用程序自动启动所有模块(所有模块中的 startWithApp: true 并且无需手动启动 Routing 和 Products 模块),则输出是这样的:

  • 路由.init
  • ProductsRou​​ting.init
  • ProductsRou​​ting.init
  • 产品.init
  • 应用程序启动
4

3 回答 3

3

这是用 v0.9.7 修复的https://github.com/derickbailey/backbone.marionette/blob/master/changelog.md#v097-view-commit-logs

于 2012-08-08T01:24:44.067 回答
2

通过在 Backbone.Marionette 上实现这个github pull request解决了这个问题。但也许 Derick Bailey(Backbone.Marionette 的创建者)对此有自己的看法?

于 2012-08-06T19:02:45.000 回答
0

如果有人仍然遇到模块似乎以错误的顺序加载的问题 - 我的解决方案是Backbone.history.start().

这是我的问题:

引导程序.js

App.start();

应用程序.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();
});

应用程序.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 文件,这样我只在我的所有应用程序模块都已正确初始化后才调用我的路由。

引导程序.js

App.start();
Backbone.history.start();

轻松豌豆。

于 2012-10-26T13:44:24.160 回答