2012-06-17 13 views
7

Divido mi aplicación en varias aplicaciones.Cómo definir/usar varias rutas usando backbone y requirejs

main.js 
app.js 
app1/ 
    |- routing 
    |- controller 
    |- app 
app2/ 
    |- routing 
    |- controller 
    |- app 

1) Cuando trato de utilizar los routers en app1, funcionan.
2) Cuando intento utilizar los enrutadores en app2, no funcionan.
3) Si comento la línea 'js/app1/routing', en main.js funcionan los enrutadores en app2.

¿Por qué me aparece este comportamiento?
¿Hay algún ejemplo de aplicación que usa enrutamiento múltiple y requirejs en github?

gracias.

Aquí está mi código:


** ** main.js

define([ 
    'js/app', 
    'js/app1/routing', // the routers in this app work 
    'js/app2/routing' // the routers in this app do not work but 
         // if I comment the previous line (js/app1/routing',) 
         // they works 
], 
function (App) 
{ 
    "use strict"; 
    App.initialize(); 
}); 

** ** app.js

define([], 
function() 
{ 
    "use strict"; 
    var app = new Backbone.Marionette.Application(); 

    return app; 
}); 

* * un PP1/rotuing **

define(['backbone','app1/controller'], function(Backbone, controller) 
{ 
    "use strict"; 
    var Router = Backbone.Marionette.AppRouter.extend({ 

     appRoutes: { 
      '*defaults': 'index1' 
     } 

    }); 
    return new Router({ 
     controller: controller 
    }); 

}); 

** app2/routing.js **

define(['backbone','app2/controller'], function(Backbone, controller) 
{ 
    "use strict"; 
    var Router = Backbone.Marionette.AppRouter.extend({ 

     appRoutes: { 
      'app2': 'index2' 
     } 

    }); 
    return new Router({ 
     controller: controller 
    }); 

}); 

Respuesta

5

El problema es causado probablemente por el orden en que se cargan los archivos del router, y los routers son creados.

El objeto history de Backbone es responsable de ejecutar las rutas. Recoge todas las rutas definidas en todos los enrutadores, cuando los enrutadores son instanciados. Luego monitorea la URL del navegador para ver los cambios. Cuando vea un cambio, tomará la primera ruta de coincidencia disponible e iniciará esa ruta, omitiendo cualquier otra cosa.

Cuando se define una ruta *defaults, todo coincide con esto. Por lo tanto, si esta ruta se carga primero, nada más afectará. Por lo tanto, necesitaría ser más explícito en los parámetros de ruta para que esta ruta no ocurra todo el tiempo, o debería asegurarse de que este enrutador se cargue al último.

+0

Gracias por su respuesta. De hecho, si configuro ''': 'index1'' en lugar de'' * defaults ':' index1'' funcionará. Gracias de nuevo. –

+0

@DerickBailey http://stackoverflow.com/questions/20017210/router-js-function-not-executed ¿Puede ayudarme? :) – CodeGuru

+0

@DerickBailey Parece que en la práctica, lo contrario de lo que usted describe es cierto: si está utilizando algún tipo de ruta de captura, debe estar cargado _primero_ para que las otras rutas más específicas funcionen. Idealmente, el comportamiento se especificaría para que podamos confiar en él, de una forma u otra. –

Cuestiones relacionadas