8

Estoy en la situación siguiente.Dependencias circulares para una aplicación web utilizando backbone.marionette y requireJs

Estoy usando el módulo requireJs to loads y no quiero usar variables globales.

main.js es responsable de cargar el enrutador.
Luego, el enrutador carga la aplicación y la aplicación carga varias subApps.

Después de que todo se haya inicializado, las subApps necesitan el router para hacer router.navigate.

Aquí el esquema:

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

entonces tengo un problema de dependencias circulares y por esa razón el router en SubApp habrá definido.

¿Cuál es la mejor manera de reorganizar mi código o solucionar este problema? ¿Hay algún ejemplo al respecto?

+0

pensé que se suponía que requirejs manejaba las dependencias circulares correctamente ... (sinceramente no lo sé. No soy fan de requirejs) –

+0

No, no es así. No indica que se trate de una dependencia circular; las cosas simplemente dejan de funcionar y algunas referencias quedan indefinidas. –

Respuesta

5

el esquema:

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

es correcto.

Si está utilizando backbone.marionette, con el fin de acceder al router desde la aplicación y SubApp, sin necesidad de utilizar global var, usted debe comenzar la aplicación en el router de esta manera:


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

¿No debería la aplicación simplemente pasar al enrutador? Parece extraño que el enrutador inicie la aplicación. ¿Qué pasa si tienes múltiples enrutadores? @AntoJs –

2

SubApp puede provocar eventos, que router maneja en lugar de tener una dependencia explícita en el router

+0

gracias, ¿me pueden dar un ejemplo? –

+0

dices que subApp puede generar eventos, pero ¿a qué módulo? Si trato de importar aplicaciones de subApp tengo el mismo problema de Dependencias circulares. –

2

En mi proyecto, yo uso la siguiente dependencia: main.js -> aplicación -> Router -> SubApp.

En app.js, creo una sola variable global que aloja un puntero a mi aplicación:

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

Esto hace que sea extremadamente fácil de acceder a las regiones de mi aplicación desde cualquier lugar, así como almacenar información de estado global en un espacio de nombre.

Intenté hacerlo sin la aplicación global al principio, pero finalmente me di por vencido y encontré que este enfoque era mucho más flexible.

Cuestiones relacionadas