8

我處於以下情況。使用backbone.marionette和requireJs的Web應用程序的循環依賴關係

我正在使用requireJs來加載模塊,我不想使用全局變量。

main.js負責加載路由器。
然後,路由器加載應用程序,應用程序加載幾個子應用程序。

所有內容初始化後,子應用程序需要router來製作router.navigate

這裏的模式:

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

然後,我有循環依賴的問題,爲此,在subApp路由器將是不確定的。

什麼是重組我的代碼或解決此問題的最佳方法? 有沒有關於這方面的一些例子?

+0

我以爲requirejs應該正確處理循環依賴...(我真的不知道,我不是requirejs的粉絲) –

+0

不,它不。它沒有事件告訴你它是一個循環依賴 - 事情停止工作,一些引用變得未定義。 –

回答

5

模式:

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

是正確的。

如果使用backbone.marionette,爲了訪問從應用程序和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

不應該只是將自己傳遞給路由器?路由器啓動應用程序似乎很奇怪。如果你有多個路由器呢? @AntoJs –

2

Subapp可以提高其路由器處理,而不是路由器

+0

謝謝,你能轉發我一個例子嗎? –

+0

你說subApp可以引發事件,但是到了哪個模塊?如果我嘗試從subApp導入應用程序,我有相同的循環依賴關係問題。 –

2

上的顯式依賴在我的項目的事件,我用下面的依賴關係:main.js - >程序 - >路由器 - > subApp。

在app.js,我創建了具有指向我的應用程序一個全局變量:

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

這使得它非常容易地從任何地方訪問我的應用程序的區域,以及存儲全局狀態信息在一個名字空間。

我試過沒有全球應用程序,但最終放棄了,發現這種方法更加靈活。