8

Ich bin in der folgenden Situation.Circular Abhängigkeiten für eine Web-app mit backbone.marionette und requireJs

Ich benutze requireJs, um Modul zu laden, und ich möchte keine globalen Variablen verwenden.

Die main.js ist dafür verantwortlich, den Router zu laden.
Dann lädt der Router die App und die App lädt mehrere SubApps.

Nachdem alles initialisiert wurde, benötigt die SubApps router für die Erstellung router.navigate.

Hier Schema:

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

Dann habe ich ein Problem von Zyklische Abhängigkeiten und aus diesem Grunde der Router in SubApp wird nicht definiert sein.

Was ist der beste Weg, um meinen Code zu reorganisieren oder dieses Problem zu beheben? Gibt es dazu ein Beispiel?

+0

ich dachte, Requirejs sollte mit zirkulären Abhängigkeiten richtig umgehen ... (Ich weiß es ehrlich gesagt nicht. Ich bin kein Fan von require) –

+0

Nein, tut es nicht. Es gibt kein Ereignis, dass es eine zirkuläre Abhängigkeit ist - die Dinge funktionieren einfach nicht mehr und einige Referenzen werden undefiniert. –

Antwort

5

das Schema:

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

ist richtig.

Wenn Sie backbone.marionette verwenden, um den Router aus der App und SubApp zugreifen zu können, ohne global var zu verwenden, sollten Sie die App in Router auf diese Weise starten:


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

soll sich die App nicht einfach an den Router übergeben? Es scheint seltsam, dass der Router die App starten würde. Was ist, wenn Sie mehrere Router haben? @AntoJs –

2

SubApp können Ereignisse auslösen, die Router eher als Griffe auf Router eine explizite Abhängigkeit

+0

danke, kannst du mir ein beispiel schicken? –

+0

Sie sagen, SubApp kann Ereignis auslösen, aber zu welchem ​​Modul? Wenn ich versuche, eine App von SubApp zu importieren, habe ich das gleiche Circular Dependencies-Problem. –

2

In meinem Projekt verwende ich die folgende Abhängigkeit: main.js -> app -> Router -> SubApp.

In app.js ich eine einzige globale Variable erstellen, die einen Zeiger auf meine App hält:

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

Dies macht es extrem einfach, Regionen meine App von überall zugreifen können, sowie Speicher globale Zustandsinformationen in einem Namensraum.

Ich habe es zuerst ohne die globale App versucht, aber letztendlich aufgegeben und fand diesen Ansatz viel flexibler.

Verwandte Themen