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
- Routing.init
- ProductsRouting.init
- ProductsRouting.init
- Products.init
- 应用程序启动
主干网.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中选择的方式。我只是忽略了这一点。