2012-06-27 6 views
38

Voglio avere un percorso 'catch all' che viene eseguito quando nessuna delle altre route definite sono abbinate. Un tipo di gestore degli errori 404 NotFound.C'è un modo per catturare tutti i percorsi non abbinati con Backbone?

Ho provato ad aggiungere questo, che funziona, ma impedisce altre vie dalla corrispondenza:

this.route(/(.*)/, 'notFound', this.notFound); 

Chiunque ha risolto questo problema prima?

risposta

78

Rispondere qui per completezza.

È possibile effettuare questa operazione in 2 modi. Definisci l'espressione regolare usando route(), come nella domanda. Tuttavia, a causa di this bug, è necessario definire tutti i percorsi tramite il metodo route() e in ordine inverso (catchall in alto). Ciò impedisce di utilizzare l'hash percorsi, in modo da (il mio) metodo preferito è:

routes: { 
    'users/search': 'searchUsers', 
    'users/:id': 'loadUser', 

    '*notFound': 'notFound' 
} 

La chiave '*notFound' può effettivamente essere qualsiasi cosa, a cominciare *. Richiede solo caratteri dopo lo * per prevenire un errore di analisi.

+11

Questo problema di routing è un grosso errore in Backbone e [lo stanno ancora facendo] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L932), la specifica JavaScript non dice nulla su [chiavi oggetto che enumerano nell'ordine sorgente] (http://stackoverflow.com/a/10624559/479863) o qualsiasi altro ordine particolare diverso da quello che sarà lo stesso in vari luoghi. A seconda dei 'percorsi' che enumerano in un ordine particolare, è sufficiente richiederlo. L'unico modo per essere sicuri è usare 'route()' manualmente. –

+0

Grazie mille per questo! : D –

+0

grazie mille grazie e grazie. – wuliwong

0

Basta aggiungerlo come l'ultimo percorso nell'elenco. In questo modo verrà abbinata solo come opzione di fallback.

-18

Penso che questo non dovrebbe passare JavaScript per risolvere, dovrebbe essere il linguaggio da risolvere, per esempio php. Sull'elaborazione delle parole da parte del server, purché si abbia la condizione è possibile rispondere con il numero di errore 404

+0

Questo riguarda il routing lato client usando 'hashs/​​hashbangs/pushstate'. Il lato server non è la risposta. – Trevor

+0

@Trevor Il problema non è con il client se il server interagisce, non è una pagina statica, non aver paura di alcun significato. – Myd

+6

Penso che potresti voler leggere un po 'di routing dell'URL lato client con Backbone prima di provare a rispondere a domande a riguardo: http://documentcloud.github.com/backbone/#Router –

1

Senza un esempio del proprio codice di routing presumibilmente assicurandomi che il tuo percorso sia occupato l'ultima rotta dovrebbe funzionare per si

+1

Sembra che tu debba effettivamente aggiungerlo come _last_ route tramite router.route(), che è il problema. Sembra un bug, archiviato qui: https://github.com/documentcloud/backbone/issues/1463 – evilcelery

+1

@evilcelery: Sì, devi aggiungere percorsi usando 'route()' se ti interessa l'ordine, Backbone (storicamente a least) presenta alcune ipotesi non valide sull'ordine di iterazione degli oggetti, non c'è un ordinamento coerente delle chiavi dell'oggetto in JavaScript. –

+1

Oops In realtà ho sbagliato la parola enfatizzata, risulta che al momento è necessario aggiungerla come * prima * via 'route()'. – evilcelery

18

C'è un altro, probabilmente più semplice/più elegante modo per risolvere questo. Backbone.History.start() restituisce true o false in base al fatto che corrisponda a una rotta oppure no. Quindi, se lo farete:

if (!Backbone.history.start()) router.navigate('404', {trigger:true}); 

invece del solito:

Backbone.History.start(); 

avrà lo stesso effetto delle altre risposte.

+0

Come è stato seppellito questo? Il bit 'router.trigger' non è aggiornato, ma la logica è corretta! http://backbonejs.org/#History-start – clayzermk1

+0

Sentiti libero di sviare questa risposta se pensi che non dovrebbe essere interrata :) – machineghost

+11

Ma credo che Backbone.History.start venga chiamato solo quando la pagina viene caricata per la prima volta, quindi se si naviga verso un percorso non valido senza aggiornare la pagina questo non funzionerà. – evilcelery

2

Questo molto piccolo plug ottiene il suo lavoro fatto: https://github.com/STRML/backbone.routeNotFound

E 'il modo più elegante e robusto per risolvere questo problema che ho trovato finora, ma si prega di tenere presente che utilizzando esso, si sono scherzi con Interno della spina dorsale.