2011-12-02 17 views
42

Tutti gli esempi su Backbone Ho visto utilizzare un router per l'intera applicazione, ma non avrebbe senso avere un router per ogni singola parte della tua app (header, footer, stage , barra laterale)? Qualcuno ha creato app con più di un router e quali sono le tue esperienze?Più router vs router singolo in BackboneJs

Pensiamo a un'app complessa con viste nidificate: non sarebbe meglio quando una vista ha il proprio router che gestisce la visualizzazione delle subviews, piuttosto che avere un grande router che deve informare la vista principale per cambiarne la sua subviews?

Lo sfondo di questa domanda: ho visto molti paralleli del router in backbone e ActivityMapper in GWT. ActivityMapper è responsabile solo di ottenere il presentatore giusto per una determinata rotta e un determinato contenitore nel DOM.

+5

L'intero punto dell'oggetto Router è correlare una raccolta di viste a un determinato URL, in particolare la parte dopo l'hash. È inteso come obiettivo esternamente navigabile (e bookmarkable). Perché avrebbe senso avere più router?Puoi dare una spiegazione più chiara di ciò che stai cercando di ottenere? –

+1

Ho concretizzato la mia domanda, si spera. –

+0

Ottima domanda Andreas, questo è sicuramente qualcosa che più persone stanno cercando di fare mentre le loro app crescono. –

risposta

22

Ho scritto un'app (ancora in fase di scrittura) con più router. tuttavia non è come pensi, è più basato su moduli e non un router per vista o qualcosa del genere.

ad esempio, dire che ho due grandi moduli nella mia app, 1 gestione di tutti i libri e 1 per gli utenti. libri hanno viste multiple (come fanno gli utenti), una vista elenco, vista di dettaglio, modificare vista, etc etc ... così ogni modulo ha il proprio router, che sta per il proprio insieme di URL:

// user module... 
var userRouter = Backbone.Router.extend({ 
    routes: { 
     "users": "loadUsers", 
     "users/add": "addUser", 
     "user/:id": "loadUser", 
     "user/:id/edit": "editUser" 
    } 

// ... rest dropped to save the trees (you never know if someone prints this out) 
}); 


// book module 
var bookRouter = Backbone.Router.extend({ 
    routes: { 
     "books": "loadBooks", 
     "books/add": "addBook", 
     "book/:name": "loadBook", 
     "book/:name/edit": "editBook" 
    } 

// ... rest dropped to save the trees (you never know if someone prints this out) 
}); 

quindi, non è come se i miei due router stessero gareggiando per lo stesso percorso, entrambi gestiscono il proprio insieme di percorsi.

modificare ora che ho avuto più informazioni via Elf Sternberg, lo so che non è possibile per impostazione predefinita per avere più router partita sulla stessa rotta. senza una soluzione alternativa, come sovrascrivere la cronologia del backbone o utilizzare spazi dei nomi nelle rotte e regex per abbinare questi percorsi. maggiori informazioni qui: multiple matching routes grazie Elf Sternberg per il collegamento.

+0

Puoi leggere il codice sorgente per Backbone per scoprirlo. Ma ecco un suggerimento: http://stackoverflow.com/questions/5223251/multiple-matching-routes/ –

+0

ok, quindi senza una certa soluzione alternativa avere più percorsi di corrispondenza non è possibile dal framework di dorsale di default. buono a sapersi, grazie per il link – Sander

23

ho appena scritto un post sul blog Subroutes modulo-specifiche in Backbone, che permettono una "sottopercorso" da definire, che presta attenzione a tutto ciò dopo il prefisso per quel percorso.

Scopri i post di blog per ulteriori spiegazioni: http://www.geekdave.com/?p=13

Questo significa che non è necessario definire in modo ridondante lo stesso prefisso più e più volte, e si può anche subroutes pigro carico come moduli sono accessibili. Il feedback è il benvenuto!

+0

L'estensione di SubRoute è fantastica! – aleha

+1

La tua risposta non fornisce informazioni sufficienti senza il collegamento esterno, rendendola una risposta povera, anche se il tuo post sul blog è di alta qualità. Dovresti davvero includere uno snippet e qualche altra spiegazione per la risposta da fornire nel tempo. Grazie mille per aver trovato il tempo di aiutare. –

2

C'è un caso limitato ma importante quando ha senso utilizzare più router. Se hai bisogno di esporre solo un sottoinsieme dei percorsi delle tue applicazioni & viste basate sui dati raccolti in fase di runtime (ad esempio, le credenziali di accesso, ad esempio, manager vs personale possono vedere & navigare tra diverse serie di viste) puoi creare un'istanza solo del router appropriato. & classi. Questo è significativo perché i percorsi possono essere segnalati e inviati da utente a utente. Ovviamente, è ancora necessario controllare il server per garantire che un utente non autorizzato non stia inviando richieste dopo aver navigato in una vista alla quale sono arrivati ​​tramite un segnalibro inviato da un utente autorizzato. Ma è meglio progettare l'applicazione in modo che la vista non autorizzata non venga semplicemente generata.