2013-04-18 16 views
11

Ho iniziato a studiare Backbonejs di recente, leggendo un libro. e mi sento un po 'confuso su questo issue.Here è un router:Quale dovrei usare? Backbone.js Router.navigate e window.location.hash

define(['views/index', 'views/login'], function(indexView, loginView) { 

    var SelinkRouter = Backbone.Router.extend({ 

     currentView: null, 

     routes: { 
      'home': 'home', 
      'login': 'login' 
     }, 

     changeView: function(view) { 
      if(null != this.currentView) 
       this.currentView.undelegateEvents(); 
      this.currentView = view; 
      this.currentView.render(); 
     }, 

     home: function() { 
      this.changeView(indexView); 
     }, 

     login: function() { 
      this.changeView(loginView); 
     } 
    }); 

    return new SelinkRouter(); 
}); 

e questo è il metodo di avvio di un'applicazione:

define(['router'], function(router) { 

    var initialize = function() { 
     // Require home page from server 
     $.ajax({ 
      url: '/home',   // page url 
      type: 'GET',   // method is get 
      dataType: 'json',  // use json format 
      success: function() { // success handler 
       runApplicaton(true); 
      }, 
      error: function() { // error handler 
       runApplicaton(false); 
      } 
     }); 
    }; 

    var runApplicaton = function(authenticated) { 

     // Authenticated user move to home page 
     if(authenticated) window.location.hash='home'; 
          //router.navigate('home', true); -> not work 

     // Unauthed user move to login page 
     else window.location.hash='login'; 
      //router.navigate('login', true); -> not work 

     // Start history 
     Backbone.history.start(); 
    } 

    return { 
     initialize: initialize 
    }; 
}); 

La mia domanda riguarda la parte runApplication. L'esempio del libro che ho letto ha passato il router nel modulo proprio come questo, ma ha usato window.location.hash = "XXX" e il router non è stato toccato affatto.

Pensavo che il metodo "navigate" avrebbe fatto spostare il browser sulla pagina specificata, ma non è successo nulla. Perché?

E per l'amor di buona pratica, qual è il modo migliore per ottenere movimento tra le pagine (o le viste)?

grazie per qualsiasi idea.

risposta

12

Secondo la documentazione, se anche voi volete chiamare la funzione appartenente ad un percorso specifico è necessario passare l'opzione trigger: true:

Ogni volta che si raggiunge un punto nella vostra applicazione che si desidera salva come URL, chiama navigate per aggiornare l'URL. Se si desidera chiamare anche la funzione route, impostare l'opzione trigger su true. Per aggiornare l'URL senza creare una voce nella cronologia del browser, impostare l'opzione di sostituzione su true.

il codice dovrebbe essere simile:

if(authenticated) 
    router.navigate('home', {trigger: true}); 

Una volta creato il router, si hanno anche per chiamare

Backbone.history.start(); 

Backbone.history.start ([opzioni])

Quando tutti i router hanno stato creato e tutti i percorsi sono stati impostati correttamente, chiama Backbone.history.start() per iniziare il monitoraggio degli eventi di hashchange e gli instradamenti di dispacciamento .

Infine la logica runApplication sarà qualcosa di simile a questo:

var runApplicaton = function(authenticated) { 

    var router = new SelinkRouter(); 
    // Start history 
    Backbone.history.start(); 

    // Authenticated user move to home page 
    if(authenticated) 
     router.navigate('home', true); 
    // Unauthed user move to login page 
    else 
     router.navigate('login', true); 
} 
+0

grazie, akoskm. come hai detto, ho provato a spostare il Backbone.history.start() davanti a router.navigate(), e ha funzionato. quindi devo iniziare la cronologia prima di navigare da qualche parte, giusto? –

+0

@HetfieldJoe È giusto iniziare a monitorare gli eventi di hashchange (navigazione) devi avviare 'Backbone.history', vedere la citazione dalla documentazione sopra. –

+0

forte e chiaro. grazie, amico. –

18

È inoltre possibile utilizzare il metodo statico per evitare router dipendenza (durante l'utilizzo requirejs per esempio).

Backbone.history.navigate(fragment, options) 

In questo modo, basta:

// Start history 
Backbone.history.start(); 

// Authenticated user move to home page 
if(authenticated) 
    Backbone.history.navigate('home', true); 
// Unauthed user move to login page 
else 
    Backbone.history.navigate('login', true); 
+0

è stato modificato, non la parte del contenuto –