使用backbone.marionette和requireJs的Web应用程序的循环依赖关系

时间:2012-06-29 16:11:41

标签: javascript backbone.js requirejs marionette backbone-routing

我遇到以下情况。

我使用requireJs来加载模块,我不想使用全局变量。

main.js负责加载路由器 然后路由器加载应用程序,应用程序加载几个subApps。

初始化完所有内容后,子应用程序需要router才能生成router.navigate

这里的架构:

main.js -> router -> app -> subApp -> router

然后我遇到循环依赖的问题,因此subApp中的路由器将是未定义的。

重新组织代码或解决此问题的最佳方法是什么? 有关于此的一些例子吗?

3 个答案:

答案 0 :(得分:5)

架构:

 main.js -> router -> app -> subApp -> router

是对的。

如果您使用backbone.marionette,要从app和subApp访问路由器,而不使用global var,您应该以这种方式在路由器中启动应用程序:


// router.js
YourApp.start(router: router);

// app.js
YourApp.addInitializer(function(options){
  // do useful stuff here
  var myView = new MyView({
    router: options.router
  });
  YourApp.mainRegion.show(myView);
});

答案 1 :(得分:2)

Subapp可以引发路由器处理的事件,而不是明确依赖路由器

答案 2 :(得分:2)

在我的项目中,我使用以下依赖项:main.js - > app - >路由器 - > subApp。

在app.js中,我创建了一个包含指向我的app的指针的全局变量:

define([...], function(...) {
return {
  initialize: function() {
    window.MyApp = new Backbone.Marionette.Application();
    // ...
    MyApp.start();
  }
};
});

这使得从任何地方访问我的应用程序区域变得非常容易,并且可以在一个名称空间中存储全局状态信息。

我一开始尝试没有全局应用程序,但最终放弃了,发现这种方法更加灵活。