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
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".
È 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.
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
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()
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.
in realtà si potrebbe semplicemente archiviare anche l'ultimo "hash" anche al posto della cronologia dei fori – mateusmaso
Grazie! Esattamente quello che stavo cercando. – Felipe
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