2012-03-07 4 views
9

Ecco il mio application-router.js file in cui sto creando Backbone.Router oggetto con solo pochi percorsi:Aggiunta programmatica di route a Backbone.Router?

var App = App || {}; 

App.Router = Backbone.Router.extend({ 
    routes : { 
     ''  : 'showDashboard', // Not shown 
     '*other': 'showModalError' 
    }, 
    defaultRoute : function(other) { $('#modal404').modal(); } 
}); 

In main file javascript application.js vorrei aggiungere a livello di codice percorsi. Ho provato con la funzione route() e non funziona, i percorsi non vengono aggiunti. Funziona tuttavia passaggio di un oggetto per il "costruttore", ma che avrà la precedenza percorsi già definiti:

// This works and overrides all defined routes in App.Router 
var router = new App.Router({ routes : { '/test/me' : 'testRoute' } }); 

// This is not working 
router.route(ExposeTranslation.get('customers.new.route'), 'newCustomer'); 
router.route('/test/me/again', 'testAgainRoute'); 

Infatti console.log(App.Router) spettacoli:

routes Object { /test/me="testRoute"} 

suppongo che mi manca qualcosa che non posso capisci, sto iniziando ad imparare questo piccolo pezzo di potente javascript.

risposta

14

Le tue chiamate router.route funzionano, quelle chiamate non sono un tuo problema. Quando si chiama route per aggiungere un nuovo percorso, il nuovo percorso va alla fine dell'elenco di instradamento. In particolare, i percorsi aggiunti dalle tue chiamate route dopo '*other' e '*other' corrisponderanno a qualsiasi elemento in modo che le tue nuove rotte vengano effettivamente ignorate.

Provare a rimuovere il percorso '*other' da routes e aggiungendolo dopo le tue due route() chiamate:

routes : { 
    ''  : 'showDashboard' // Not shown 
}, 

router.route(ExposeTranslation.get('customers.new.route'), 'newCustomer'); 
router.route('/test/me/again', 'testAgainRoute'); 
router.route('*other', 'showModalError'); 

I percorsi non sono memorizzati nel App.Router oggetto, they're stored inside Backbone.history:

route: function(route, name, callback) { 
    // ... 
    Backbone.history.route(route, _.bind(function(fragment) { 
    //... 
    }, this)); 
    return this; 
}, 

Ecco perché la tua console.log(App.Router) non dice nulla di utile.