2012-03-21 3 views
11

Esiste questa possibilità? Il nostro sito non è una pagina, ma tutti i file js compressi all'interno di application.js, posso utilizzare il router backbone per l'analisi location.path?Come applicare il router backbone per il percorso completo, non un hash

Provo Backbone.history.start(pushState: true). Funziona per me, ma è corretto? Ho bisogno solo di un parsing iniziale, non di route complicate e di reindirizzamenti via Backbone.Router.

+0

Cosa stai cercando di realizzare? Puoi avere qualche esempio e cosa hai già provato? – tkone

+0

per esempio, quando apro il percorso '/ testimonials' voglio svolgere qualche funzione (nel router). È tutto ciò di cui ho bisogno, perché tutti i miei moduli sono all'interno di 'application.js' (è l'app per rails). E voglio sapere, cosa dovrei eseguire ... – ValeriiVasin

risposta

13

È possibile utilizzare solo un router standard. Quando si crea un'istanza e si avvia l'oggetto della cronologia, è possibile impostare come base la directory root che deve utilizzare. In questo caso sembra che si desidera utilizzare per '/'

var MyRouter = Backbone.Router.extend({ 
    routes: { 
     "application/": "somefunc" 
    } 
} 

var app = new MyRouter(); 
Backbone.history.start({pushState: true, root: '/'}); 

Avrai bisogno di impostare il server Web per rendere il vostro file HTML ogni volta che qualsiasi directory è chiamato sul server (quindi backbone, non rotaie, gestirà i tuoi percorsi).

Infine, nel file HTML ho una funzione che gira su Dom ready e estrae il percorso dall'URL e lo passa a navigate.

var path = location.pathname; 
app.navigate(path, {trigger: true}); 
+0

C'è un problema con IE ... IE non ha pushState e Router andranno sempre a # # my-path' invece di '/ my/path' .. È possibile ripararlo? – ValeriiVasin

+1

@InviS No. 'pushState' funziona solo su browser che supportano l'oggetto Cronologia HTML5. [Backbone tornerà in modo specifico alla soluzione di hash [(http://documentcloud.github.com/backbone/#History-start) sui browser non supportati. Il problema con i browser che non supportano 'pushState' è che il browser farà una nuova richiesta quando gli dai un URL valido modificando l'oggetto' location'. – tkone

+0

Ma non ho bisogno di pushState ... Lo sto usando per individuare su quale pagina sono ... C'è qualche metodo per farlo? come impostare la navigazione di default dal percorso root '/', non '#'. – ValeriiVasin

0

Avrai bisogno di scrivere il tuo router, ma per fortuna è abbastanza facile. Ecco quello che ho appena scritto per un sito su cui sto lavorando:

var routes = { 
    "terms": "terms", 
    "privacy": "privacy", 
    "password-reset": "reset" 
}; 

var path = window.location.pathname.replace("/", ""); 
var page = routes[path]; 
if (!page) { 
    page = "404"; 
} 

non ho bisogno di nessuna delle corrispondenti fantasia regole che Backbone fornisce, ma non sarebbe troppo difficile da estendere questa idea con regolare espressioni. O forse qualcuno potrebbe scrivere un piccolo modulo che usa la logica di matching di Backbone ma non esegue il reindirizzamento hash/pushState.

+0

è un esempio abbastanza semplice. Di solito, i percorsi non sono così semplici e potresti trovare la necessità di fornire un percorso come questo: '/ hello/world /: post /: date' – ValeriiVasin

-1

Ho avuto lo stesso problema di IE, c'è una soluzione semplice. Scarica modernizr e includilo.

Poi fare:

Backbone.history.start({ pushState: Modernizr.history }); 

Questo dovrebbe fare il trucco.

+1

Backbone rileva automaticamente se il browser ha pushState e ricadrà agli hash se pushState non è supportato, quindi non è necessario - basta impostare pushState su true in history.start. –

1

Sto usando questo:

window.location.href.replace(Backbone.history.getFragment(), ''); 

per ottenere l'URL assoluto della radice dorsale di app.