2012-06-17 14 views
7

Ho diviso la mia app in diverse app.Come definire/utilizzare diversi percorsi utilizzando backbone e requirejs

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

1) Quando si tenta di utilizzare il router in app1, lavorano.
2) Quando provo a utilizzare i router in app2, non funzionano.
3) Se commento la riga 'js/app1/routing', in main.js i router in app2 funzionano.

Perché ottengo questo comportamento?
C'è qualche esempio di app che utilizza più routing e requirejs su github?

grazie.

Ecco il mio codice:


** ** 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; 
}); 

* * a 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 
    }); 

}); 

risposta

5

Il problema è probabilmente causato da l'ordine in cui vengono caricati i file router e router sono creati.

L'oggetto history di Backbone è responsabile dell'esecuzione di percorsi. Raccoglie tutte le rotte definite su tutti i router, quando i router vengono istanziati. Quindi controlla l'url del browser per le modifiche. Quando vede una modifica, prenderà la prima rotta di abbinamento disponibile e spara quella rotta, saltando qualcos'altro.

Se si dispone di una route *defaults, tutto corrisponde a questo. Pertanto, se questa rotta viene caricata per prima, nient'altro colpirà. Pertanto, è necessario essere più espliciti nei parametri del percorso in modo che questo percorso non colga in continuazione, oppure è necessario assicurarsi che questo router sia caricato per ultimo.

+0

Grazie per la risposta. Infatti, se imposto ''': 'index1'' invece di'' * defaults ':' index1'' funzionerà. Grazie ancora. –

+0

@DerickBailey http://stackoverflow.com/questions/20017210/router-js-function-not-executed Puoi aiutarmi qui :) – CodeGuru

+0

@DerickBailey in realtà sembra che in pratica il contrario di ciò che descrivi sia vero: se stai usando una sorta di percorso di catchall, deve essere caricato _primo_ in modo che gli altri percorsi più specifici funzionino. Idealmente il comportamento sarebbe specificato in modo tale da poter fare affidamento su di esso, in un modo o nell'altro. –

Problemi correlati