Backbone.js 应用程序启动和主干问题。木偶模块

Backbone.js 应用程序启动和主干问题。木偶模块,backbone.js,marionette,Backbone.js,Marionette,不幸的是,我在理解主干网、木偶模块和子模块的启动时遇到了问题。初始值设定项被多次调用,而不是每次调用一次 我需要做什么才能使事情以可预见的方式运作 PP = new Backbone.Marionette.Application(); PP.bind('start', function() { console.log('application start'); PP.module('Routing').start(); PP.module('Products').st

不幸的是,我在理解主干网、木偶模块和子模块的启动时遇到了问题。初始值设定项被多次调用,而不是每次调用一次

我需要做什么才能使事情以可预见的方式运作

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();
});
(代码也可用作)

上述代码在控制台中输出以下行:

  • 应用程序启动
  • Routing.init
  • ProductsRouting.init
  • Routing.init
  • ProductsRouting.init
  • Products.init
  • Products.init
这就是我所期望的:

  • 应用程序启动
  • Routing.init
  • Products.init
如果您决定使用您的应用程序自动启动所有模块(startWithApp:true,在所有模块中,并且不手动启动路由和产品模块),则输出如下:

  • Routing.init
  • ProductsRouting.init
  • ProductsRouting.init
  • Products.init
  • 应用程序启动

通过在主干网上实现此功能,问题得以解决。但是Derick Bailey(Backbone.Marionette的创建者)可能对此有自己的看法?

通过在Backbone.Marionette上实现此功能,问题得到了解决。但也许德里克·贝利(主干网木偶网的创建者)对此有自己的看法?

这是固定的w/v0.9.7

这是固定的w/v0.9.7

以防任何人仍然存在模块加载顺序错误的问题-我的解决方案是
主干网.history.start()

我的问题是:

bootstrap.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();
App.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();
App.MyModule.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();
本例中未定义App.MyModule.myMethod,因此应用程序启动时不会发生任何事情

我发现,问题是我在哪里调用了
Backbone.history.start()
。我把这个调用移到了bootstrap.js文件中,这样我只在所有应用程序模块正确初始化后调用路由

bootstrap.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();

轻松peazy。

如果任何人仍然存在模块加载顺序错误的问题-我的解决方案是找到
主干.history.start()

我的问题是:

bootstrap.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();
App.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();
App.MyModule.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();
本例中未定义App.MyModule.myMethod,因此应用程序启动时不会发生任何事情

我发现,问题是我在哪里调用了
Backbone.history.start()
。我把这个调用移到了bootstrap.js文件中,这样我只在所有应用程序模块正确初始化后调用路由

bootstrap.js

App.start();
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.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});
App.start();
Backbone.history.start();

轻松peazy。

我想补充一个问题:如何在不手动启动模块的情况下控制模块的初始化?我经常使用未定义的方法,这些方法在自动启动时不会初始化。据我所知,当前版本的主干网.木偶(0.9.6)应该存在相同的问题。我只会尝试运用那些惯用的观点。那个拉式请求会解决它。正在找时间将其合并并发布。谢谢。您是否已经知道在自动启动过程中,模块和子模块的不同初始化会产生未定义的方法(与木偶0.9.3相比)?或者是故意的,我必须重组我的应用程序?如果我在实现中没有犯错误,BBCloneMail也应该有同样的问题。手动启动模块的唯一原因是避免了这些问题……我不确定您试图描述的问题是什么。你能在邮件列表上公布更多细节吗?幸运的是,现在没有理由在邮件列表上发布这个,因为我自己犯了这个错误。在处理我的测试代码()时,现在很清楚,我必须精确地选择addinitializer的类型。对于基于模块的初始值设定项,javascript文件的加载顺序或手动模块启动的顺序起着重要作用。基于应用程序的初始值设定项并非如此。然后我可以绑定到start事件,所有方法都已定义并可以使用。这也是您在BBCloneMail中选择的方式。我只是忽略了这一点,我想补充一个问题:如何在不手动启动模块的情况下控制模块的初始化?我经常使用未定义的方法,这些方法在自动启动时不会初始化。据我所知,当前版本的主干网.木偶(0.9.6)应该存在相同的问题。我只会尝试运用那些惯用的观点。那个拉式请求会解决它。正在找时间将其合并并发布。谢谢。您是否已经知道在自动启动过程中,模块和子模块的不同初始化会产生未定义的方法(与木偶0.9.3相比)?或者是故意的,我必须重组我的应用程序?如果我在实现中没有犯错误,BBCloneMail也应该有同样的问题。手动启动模块的唯一原因是避免了这些问题……我不确定您试图描述的问题是什么。你能在邮件列表上公布更多细节吗?幸运的是,现在没有理由在邮件列表上发布这个,因为我自己犯了这个错误。在处理我的测试代码()时,现在很清楚,我必须精确地选择addinitializer的类型。对于基于模块的初始值设定项,javascript文件的加载顺序或手动模块启动的顺序起着重要作用。基于应用程序的初始值设定项并非如此。然后我可以绑定到start事件,所有方法都已定义并可以使用。这也是您在BBCloneMail中选择的方式。我只是忽略了这一点。