2011-12-07 6 views
8

Utilizzando Backbone.js, è possibile far navigare il router verso la pagina da cui proviene? Mi piacerebbe usarlo per il caso in cui cambio il mio URL quando appare un popup, e voglio cambiarlo di nuovo, quando nascondo il popup. Non voglio semplicemente tornare indietro, perché voglio mantenere la pagina di sfondo esattamente nella stessa posizione in cui l'ho lasciata prima di mostrare il popupCambia in modo silenzioso l'URL con il precedente utilizzando Backbone.js

risposta

14

si può risolvere questo problema estendendo Backbone.Router e la memorizzazione di tutti i percorsi durante la navigazione.

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 

Poi, quando si deve respingere la vostra scelta obbligatoria, è sufficiente chiamare il metodo MyRouter.previous() che vi reindirizzerà indietro all'ultimo "hash".

+3

in realtà si potrebbe semplicemente archiviare anche l'ultimo "hash" anche al posto della cronologia dei fori – mateusmaso

+0

Grazie! Esattamente quello che stavo cercando. – Felipe

+0

Non credo che questo garantirà che il metodo storeRoute verrà sempre chiamato prima di un metodo di routing che potrebbe utilizzarlo. Di conseguenza, ciò che è memorizzato nella cronologia non sarà coerente. – DrewB

-2

È possibile attivare un percorso nel onCloseEvent del popup o sovrapporre con :

router.navigate('/lasturl/'); 

Questo imposta l'URL. Se si passa true come secondo parametro, si eseguirà anche l'azione rotte. Altrimenti la pagina rimarrà invariata.

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

+8

Naturalmente, ma ancora una volta la domanda è, come faccio a sapere quale è l'ultimo URL? Backbone fornisce un metodo utile o dovrò recuperarlo da window.history? – user802232

1

Penso che la risposta di mateusmaso sia in gran parte giusta, ma richiede alcune modifiche per garantire di ottenere sempre l'URL giusto che stai cercando.

Per prima cosa è necessario eseguire l'override del metodo percorso per avere un metodo beforeRoute fuoco:

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

Poi si associa l'evento e inizializzare la variabile di istanza storia:

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

Successivo creare metodi di supporto per memorizzando e recuperando il frammento:

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

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

Infine, tu è necessario un metodo di supporto finale che può essere utilizzato per modificare l'URL senza ricaricare e archiviare il frammento risultante. È necessario utilizzare questo quando si chiude il pop-up o non si avrà il frammento previsto nella cronologia se l'utente ottiene nuovamente il pop-up senza spostarsi da nessun'altra parte. Questo perché chiamare la navigazione senza "trigger: true" non attiverà il gestore di eventi per memorizzare il frammento.

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

Questa risposta non può affrontare la questione, ma è preety più o meno lo stesso problema. Non sono riuscito a navigare in silenzio su un percorso precedente o su un percorso personalizzato a causa della barra finale. Affinché le funzioni di instradamento NON vengano attivate, utilizzare {trigger:false} oppure non utilizzare affatto il trigger poiché false è il comportamento predefinito e assicurarsi che il percorso inizi con #something anziché "#/qualcosa" (notare la barra), oppure cambia il regEx all'interno di Backbone.js, la parte del router.