AMD:两个模块相互依赖

时间:2013-03-15 17:53:43

标签: architecture requirejs amd

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

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

  var app = Marionette.Application()

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

  return app

})

app模块创建Marionette.Application的实例并添加适当的初始化程序。其中之一是创建我的Links集合的实例。

但是,我的collections/links模块依赖于app模块作为其观察者系统。

// 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似乎在加载collections/links之前初始化app模块。

如何使用AMD设计我的应用程序,以便app可以使用我的collections/links模块,collections/links可以使用我的app模块?

1 个答案:

答案 0 :(得分:0)

然后,您应该从app创建两个模块:事件管理器和初始化程序

问题是你的app模块不是模块化的(它没有一个任务/关注点),它是一堆代码汇集在一起​​。

BTW,从Backbone 0.9.9开始,Backbone对象是一个全局事件管理器。另外,创建自己的非常简单:_.extend({}, Backbone.Events)