2013-03-15 2 views
0

У меня есть модуль приложения Backbone под названием app.js, который выглядит примерно так:AMD: Наличие двух модулей зависят друг от друга

// 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?

ответ

0

Затем вы должны создать два модуля из app: диспетчер событий и инициализатор .

Проблема в том, что ваш модуль app не является модульным (у него нет ни одной задачи/проблемы), это куча кода, сбитого вместе.

BTW, as of Backbone 0.9.9, Backbone объект является глобальным менеджером событий. Кроме того, создание собственного довольно просто: _.extend({}, Backbone.Events).