underscore template que backbonejs backbone.js browser-history

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.