2012-06-06 20 views
10

voglio avere ogni richiesta di pagina reindirizzamento al mio index.html, e qualunque link (non #urls -// URL reali) cliccato nella mia app a correre attraverso router.js quindi non ci sono essenzialmente nessuna pagina rinfresca - puramente ajax. C'è un modo semplice per farlo con il backbone routing e htaccess?Backbone router non funziona con pushState

Lo faccio funzionare al momento se tolgo {pushState: true} e formatto i miei collegamenti come #login. Tuttavia, quando abilito pushState e clic su #login, non succede nulla. Invece, è solo una volta che aggiorno la pagina che Backbone interpreta lo #login e segue la rotta per il rendering loginView.

Ecco il mio router:

// Filename: router.js 
define([ 'views/beta/requestInvite', 'views/beta/login' ], 
function(requestInviteView, loginView) { 
    var AppRouter = Backbone.Router.extend({ 
     routes : { 
      // Pages 
      'login' : 'login', 

      // Default 
      '*actions' : 'defaultAction' 
     }, 

     // Pages 
     login : function() { 
      loginView.render(); 
     }, 

     defaultAction : function(actions) { 
      requestInviteView.render(); 
     } 
    }); 

    var initialize = function() { 
     var app_router = new AppRouter; 
     Backbone.history.start({pushState: true}); 
    }; 
    return { 
     initialize : initialize 
    }; 
}); 

Quello che vorrei che accada è in requestInviteView, quando il collegamento a /login viene cliccato, l'URL cambia a /login e il loginView è resa.

Grazie per qualsiasi aiuto!

risposta

10

Cambiare da hash a pushstate non è così banale come cambiare un singolo parametro come si può indurre a pensare. Quello che faccio è catturare l'evento click nella mia vista e chiamare app.navigate per attivare il percorso.

app.navigate("/login", {trigger: true}); 

http://backbonejs.org/#Router-navigate

+0

si può fare questo in qualche modo automaticamente utilizzando un metodo simile a [questo gist] (https : //gist.github.com/colllin/5717284). – colllin

5

Anche se la risposta di Anthony funzionerà, utilizzando trigger: true solito non è il miglior modo di agire. Invece la tua app dovrebbe essere strutturata in modo da poter chiamare navigate con il valore predefinito trigger lasciato a false.

Derick Bailey parla del problema sul suo blog all'indirizzo http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/ (paragrafo "Il‘AHA!’Moment Per quanto riguarda il secondo argomento della Router.Navigate")

Inoltre, un intero capitolo che spiega il routing in modo più dettagliato (tra cui il motivo si dovrebbe lasciare trigger a false) è scaricabile gratuitamente in questo campione pdf libro: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf (Full disclosure: io sono il libro dell'autore)

+1

interessante, ma la replica della logica per ogni controller solo per evitare un secondo parametro sembra ridondante. Ho scenari rari in cui io uso questo (cioè quando un percorso è richiesto fuori ordine, lo cambio al volo e renderò la vista corretta). il contesto di questa domanda è di innescare un'azione dopo aver fatto clic su un collegamento, e imo lo vedo scatenarlo come il meglio. – Garrett