8

Sono nella seguente situazione.Dipendenze circolari per un'app Web che utilizza backbone.marionette e requireJs

Sto usando requireJs per caricare il modulo e non voglio utilizzare variabili globali.

Il file main.js è responsabile del caricamento del router.
Quindi il router carica l'app e l'app carica diverse subapp.

Dopo che tutto è stato inizializzato, le subApps hanno bisogno dello router per fare router.navigate.

Ecco lo schema:

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

poi ho un problema di circolari dipendenze e per questo motivo il router in SubApp sarà indefinito.

Qual è il modo migliore per riorganizzare il mio codice o per risolvere questo problema? C'è qualche esempio a riguardo?

+0

pensavo che requirejs doveva gestire correttamente le dipendenze circolari ... (onestamente non lo so, non sono un fan dei requirejs) –

+0

No, non è così. Non è detto che si tratti di una dipendenza circolare: le cose smettono di funzionare e alcuni riferimenti diventano indefiniti. –

risposta

5

lo schema:

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

è giusto.

Se si utilizza backbone.marionette, al fine di accedere al router dal app e SubApp, senza l'utilizzo di global var, si dovrebbe avviare l'applicazione in router in questo modo:


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

non dovrebbe passare l'app al router? Sembra strano che il router avvii l'app. Cosa succede se hai più router? @AntoJs –

2

SubApp può generare eventi quale router gestisce piuttosto che avere una dipendenza esplicita sul router

+0

grazie, puoi inoltrarmi un esempio? –

+0

dici che subApp può generare eventi, ma a quale modulo? Se provo a importare app da subApp, ho lo stesso problema delle dipendenze circolari. –

2

Nel mio progetto, io uso il seguente dipendenze: main.js -> App -> router -> SubApp.

In app.js, creo una singola variabile globale che contiene un puntatore alla mia app:

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

Questo rende estremamente facile le regioni di mia app da qualsiasi luogo, così come archivio di informazioni di stato globale nello spazio di un nome.

Ho provato a farlo senza l'app globale, ma alla fine ho rinunciato e ho trovato questo approccio molto più flessibile.