template - Selective history.back() utilizando Backbone.js
underscore js que es (2)
Tengo una aplicación Backbone. Estoy usando Backbone.history para habilitar el uso del botón Atrás. Tenemos una página (configuraciones) que carga automáticamente una ventana emergente que requiere la entrada del usuario. Si el usuario elige cancelar, quiero volver a la página anterior. Puedo hacer esto usando window.history.back ().
El problema es que si el usuario va directamente a esa página (configuración de la aplicación) desde otra url (como google) escribiendo la url en el navegador, quiero redireccionar al usuario a la página de inicio (app /) en lugar de volver a Google.
No he podido encontrar ninguna forma de hacer esto. Backbone.history parece almacenar información del botón Atrás del navegador, por lo que tiene un historial, incluso si acaban de llegar a la aplicación. Tampoco pude encontrar una manera de ver la URL anterior.
es posible?
Envuelva la lógica de navegación trasera en un método propio. Quizás en el enrutador:
var AppRouter = Backbone.Router.extend({
initialize: function() {
this.routesHit = 0;
//keep count of number of routes handled by your application
Backbone.history.on(''route'', function() { this.routesHit++; }, this);
},
back: function() {
if(this.routesHit > 1) {
//more than one route hit -> user did not land to current page directly
window.history.back();
} else {
//otherwise go to the home page. Use replaceState if available so
//the navigation doesn''t create an extra history entry
this.navigate(''app/'', {trigger:true, replace:true});
}
}
});
Y usa el método del enrutador para navegar hacia atrás:
appRouter.back();
Utilicé la misma respuesta de jevakallio , pero tuve el mismo problema que el comentarista Jay Kumar tuvo: El routesHit
no lo resta, así que appRouter.back()
bastará para sacar al usuario de la aplicación, así que agregué 3 líneas:
var AppRouter = Backbone.Router.extend({
initialize: function() {
this.routesHit = 0;
//keep count of number of routes handled by your application
Backbone.history.on(''route'', function() { this.routesHit++; }, this);
},
back: function() {
if(this.routesHit > 1) {
//more than one route hit -> user did not land to current page directly
this.routesHit = this.routesHit - 2; //Added line: read below
window.history.back();
} else {
//otherwise go to the home page. Use replaceState if available so
//the navigation doesn''t create an extra history entry
if(Backbone.history.getFragment() != ''app/'') //Added line: read below
this.routesHit = 0; //Added line: read below
this.navigate(''app/'', {trigger:true, replace:true});
}
}
});
Y usa el método del enrutador para navegar hacia atrás:
appRouter.back();
Líneas agregadas:
Primero uno: resta 2 de routesHit
, luego cuando se redirige a la página "back" ganará 1, así que es como si routesHit
menos un 1.
Segundo: si el usuario ya está en "casa", no habrá una redirección, así que no haga nada con routesHit
.
Tercero: si el usuario está donde comenzó y se lo envía de regreso a "casa", configure routesHit = 0
, luego cuando se lo redireccione a "home" routesHit
será 1 nuevamente.