2012-03-14 14 views
7

Solo me pregunto si hay una manera simple de activar una función personalizada cada vez que se utiliza un enrutador Backbone.js, sin tener que agregarlo en cada una de las funciones del enrutador. Ahora mi guión es el siguiente:Función de disparo de Backbone.js cada vez que se usa el enrutador

var AppRouter = Backbone.Router.extend({ 

    routes: { 
     '' : 'index', 
     'test': 'test', 
    }, 

    initialize: function() { 
    }, 

    index: function() { 
     customFunction(); 
     indexView.render(); 
    }, 

    test: function() { 
     customFunction(); 
     testView.render(); 
    }, 

}); 

Me gustaría tener algo como esto:

var AppRouter = Backbone.Router.extend({ 

    routes: { 
     '' : 'index', 
     'test': 'test', 
    }, 

    initialize: function() { 
    }, 

    index: function() { 
     indexView.render(); 
    }, 

    test: function() { 
     testView.render(); 
    }, 

    change: function() { 
     customFunction(); 
    } 

}); 

¿Alguien tiene alguna sugerencia?

Respuesta

19

Siempre que una ruta coincida con el Router, un evento route:[name] se activa con el nombre de la ruta coincidente, para permitir que las clases escuchen ciertas coincidencias de ruta. Todos los objetos de la red troncal también admiten el evento all que se activa siempre que lo hace un evento.

Así que puede hacer uso de esto para enlazar al evento all en el Router, que se activará siempre que el enrutador haga un enrutamiento.

initialize: function() { 
    this.bind("all", this.change) 
}, 

Si le interesó la ruta que coincidía, se pasa como el primer parámetro de la función enlazada.

Más detalles here in the FAQ

+0

¡Gracias, trabajado como un encanto! Aunque tuve que usar this.bind() en lugar de solo bind() – hampusohlsson

+0

Vaya, actualizaré mi respuesta con eso. – obmarg

+0

¿El evento ocurre antes o después de que la ruta se "ejecute" si tienes '{trigger: true}' como parte de tu llamada '.navigate'? – tkone

9

A (nuevo) de manera más Backbone de escribir el enlace es:

initialize: function() { 
    this.listenTo(this, "all", this.change) 
}, 

una mejor escuchar sería simplemente route si me preguntas; Debido all desencadena dos eventos, creo que estos:

"ruta: [nombre]" (params) - Fired por el router cuando una ruta específica es emparejado.
"route" (route, params) - Encendido por el enrutador cuando se ha emparejado cualquier ruta .

+2

esta es la mejor respuesta a partir de 2015 –

+2

y fue hecha en 2014 :) –

0

Soy nuevo en la red troncal. Siguiendo la respuesta de Laurens, me las arreglé para llamar a cada cambio de ruta por debajo de

app_router.on('route', function(e){ 
    console.log(e); 
}); 
Cuestiones relacionadas