2012-02-25 25 views
6

Ho la seguente router:Backbone Router non innescare percorso

appRouter = Backbone.Router.extend({ 
    routes: { 
    '': 'inbox', 
    'inbox': 'inbox', 
    'discussions_engagement': 'contacts', 
    }, 

    inbox: function(page) { 
    console.log('inbox'); 
    var page = page || 1; 
    engage.app.hydrateInbox(page, engage.app.showInbox); 
    }, 
    .... 
}; 

Quando sono in http: // [...]/# inbox e che io chiamo

appRouter.navigate('inbox', {trigger: true}); 

l'azione posta in arrivo non spara quale è ciò che voglio ottenere. Ora ho guardato la fonte di Backbone (https://github.com/documentcloud/backbone/blob/master/backbone.js#L1027) e vedo che non supporta quello che sto cercando di fare, ma è c'è un modo per realizzare questo?

+1

Non è una risposta alla tua domanda, ma forse una soluzione (se ti prendo correttamente): (Ri-) Renderizza la tua pagina/la tua vista più genitoriale, ad es. 'AppView.render()'. – SunnyRed

risposta

4

vorrei creare un gestore evento nella vostra oggetto engage.app, in questo modo:

var vent = _.extend({}, Backbone.Events); 

Poi, nel tuo router fare questo per il percorso casella di posta:

vent.trigger('inbox:show', page); 

E gestire questo evento in l'oggetto engage.app, facendo il codice lì che era nel gestore di route.

Ora, invece di chiamare appRouter.navigate è possibile attivare lo stesso evento.

Inoltre, da quel gestore, è possibile chiamare appRouter.navigate('inbox'); senza passare true. Ora puoi portare la tua app allo stato desiderato senza tentare di forzare il percorso.

+0

Questo è quello che ho finito per fare; sembra una soluzione semi-decente anche se crea qualche codice in più. –

+0

@JasonStonebraker [Questo collegamento] (http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/) spiega l'idea. Questo schema ha funzionato bene per me. Lascia il router con un singolo lavoro, che è il routing basato sulle modifiche all'URL del browser. Questa domanda riguardava il tentativo di attivare un percorso quando si è già su quella rotta. Questa soluzione non è una soluzione alternativa (IMO) ma un design migliore. –

-1

Un'altra opzione è solo quello di chiamare il metodo

appRouter.inbox(); 
2

Per quanto posso dire ... Come di Backbone 0.9.10 utilizzando appRouter.navigate('inbox', {trigger: true}); funziona come previsto.

+0

Il sorgente Backbone ha ancora questo: 'if (this.fragment === framment) return;', quindi penso che il problema di Gavin esista ancora. Inoltre, la fonte ha un commento: "L'oggetto opzioni può contenere" trigger: true "se si desidera che la richiamata della rotta sia attivata (in genere non desiderabile)". –