Architecture AMD:有两个相互依赖的模块

Architecture AMD:有两个相互依赖的模块,architecture,requirejs,amd,Architecture,Requirejs,Amd,我有一个主干应用程序模块,名为app.js,看起来像这样: // module: app define([ 'Marionette', 'collections/links' ], function (Marionette, Links) { var app = Marionette.Application() app.addInitializer(function () { new Links() }) return app }) app模块创建一个m

我有一个主干应用程序模块,名为
app.js
,看起来像这样:

// module: app
define([
  'Marionette',
  'collections/links'
], function (Marionette, Links) {

  var app = Marionette.Application()

  app.addInitializer(function () {
    new Links()
  })

  return app

})
app
模块创建一个
marionete.Application
的实例,并添加相应的初始化器。其中之一是创建我的
链接
集合的实例

但是,my
collections/links
模块依赖于其观察者系统的
应用程序
模块

// module: collections/links
define([
  'app',
  'Backbone'
], function (app, Backbone) {

  var Links = Backbone.Collection.Extend({
    initialize: function () {
      // Outputs undefined
      console.log(app)
      // This then wouldn't work because app hasn't been initialised:
      // app.on('someEvent', function () {})
    }
  })

  return Links

})
由于此模块被列为
app
的依赖项,而
app
是此模块的依赖项,因此我发现自己具有递归依赖项。最后,RequireJS似乎在加载
app
之前初始化了
collections/links
模块


我如何使用AMD设计我的应用程序,以便
app
可以使用我的
集合/链接
模块和
集合/链接
可以使用我的
app
模块?

然后,您应该从
app
中创建两个模块:事件管理器和初始值设定项

问题是你的
应用程序
模块不是模块化的(它没有一个任务/关注点),而是一堆代码组合在一起

顺便说一句,从主干网0.9.9开始,
主干网
对象是一个全局事件管理器。另外,创建您自己的是非常容易的:
.extend({},Backbone.Events)