2011-12-07 20 views
8

Usando Backbone.js, ¿es posible hacer que el enrutador navegue a la página de donde vino? Me gustaría usar eso para el caso en que cambie mi URL cuando aparezca una ventana emergente, y quiero volver a cambiarla cuando oculto la ventana emergente. No quiero simplemente regresar, porque quiero mantener la página de fondo exactamente en la misma posición que la dejé antes de mostrar la ventana emergenteSilenciosamente cambie la URL a anterior usando Backbone.js

Respuesta

14

Puede resolver este problema mediante la ampliación de Backbone.Router y almacenar todas las rutas durante la navegación.

class MyRouter extends Backbone.Router 
    constructor: (options) -> 
    @on "all", @storeRoute 
    @history = [] 
    super options 

    storeRoute: -> 
    @history.push Backbone.history.fragment 

    previous: -> 
    if @history.length > 1 
     @navigate @history[@history.length-2], true 

Entonces, cuando se tiene que desestimar su modal, sólo tiene que llamar al método MyRouter.previous() que volverá a dirigir de nuevo a la última "control".

+3

en realidad, simplemente podría almacenar el último "hash" también en lugar de la historia del agujero – mateusmaso

+0

¡Gracias! Exactamente lo que estaba buscando. – Felipe

+0

No creo que esto garantice que siempre se llame al método storeRoute antes de un método de enrutamiento que pueda usarlo. Como resultado, lo que se almacena en la historia no será coherente. – DrewB

-2

Puede desencadenar una ruta en el evento onCloseEvent de su ventana emergente o superposición con :

router.navigate('/lasturl/'); 

Esto configurará la url. Si pasa true como el segundo param, también ejecutará la acción de rutas. De lo contrario, la página no se modificará.

http://documentcloud.github.com/backbone/#Router-navigate

+8

Por supuesto, pero nuevamente la pregunta es, ¿cómo sé cuál es la última url? ¿El Backbone proporciona un método útil, o tendré que buscarlo desde window.history? – user802232

1

Creo que la respuesta de Mateusmaso es correcta pero requiere algunos ajustes para garantizar que siempre obtenga la URL correcta que está buscando.

En primer lugar es necesario reemplazar el método ruta a tener un método beforeRoute fuego:

route: (route, name, callback) => 
    Backbone.Router.prototype.route.call(this, route, name, => 
    @trigger('beforeRoute') 
    callback.apply(this, arguments) 
    ) 

A continuación, enlazar el evento e inicializar la variable de instancia historia:

initialize: (options) ->  
    @history = [] 
    @on "beforeRoute", @storeRoute 

Siguiente crear métodos de ayuda para almacenar y recuperar el fragmento:

storeRoute: => 
    @history.push Backbone.history.fragment 

previousFragment: => 
    @history[@history.length-2] 

Finalmente, usted necesita un método de ayuda final que se pueda usar para cambiar la URL sin volver a cargar y almacenar el fragmento resultante. Debe usar esto al cerrar la ventana emergente o no tendrá el fragmento esperado en su historial si el usuario recibe la ventana emergente nuevamente sin navegar en ningún otro lado. Esto se debe a que al llamar a navegar sin "trigger: true" no se activará el controlador de eventos para almacenar el fragmento.

changeAndStoreFragment: (fragment) => 
    @navigate(fragment) 
    @storeRoute() 
0

Esta respuesta puede no abordar la pregunta, pero es mucho más o menos el mismo problema. No pude navegar en silencio a una ruta anterior, o una ruta personalizada debido a la barra final. Para que las funciones de ruta NO se activen, use {trigger:false}, o no use ningún disparador ya que false es el comportamiento predeterminado, y asegúrese de que su ruta comience con #something en lugar de '#/algo' (observe la barra inclinada) o cambie el regEx dentro de Backbone.js, la parte del enrutador.

Cuestiones relacionadas