Las ansiosas actualizaciones de URL son agradables cuando todo logra abortar o hacer la transición en el mismo runloop. Pero los abortos y las transiciones pueden ocurrir en ciclos de ejecución posteriores, y en ese caso dejamos la aplicación en un estado roto.
En el caso de abortar, terminas con una URL que no refleja tu estado actual real. La próxima vez que el usuario presione el botón Atrás, no pasa nada.
En el caso de la redirección, se rompe el botón de retroceso dejando un estado intermedio en el historial del usuario, que a menudo lo redirigirá de nuevo.
Hablé de esto con history.back()
o similar cuando ocurre un aborto.
Estoy de acuerdo con este tema. Lo estoy viendo ahora, incluso si hago un transition.abort()
en el gancho willTransition
de la ruta. La URL refleja la página a la que habría ido si no se hubiera cancelado la transición.
: +1:
@ ef4 Me encantaría que
Puedo trabajar en esto, pero probablemente no de inmediato.
: +1: se encontró con esto al seguir el código de muestra willTransition
en los documentos de la API. La URL se cambia aunque se haya llamado abort
.
He tenido el mismo problema. Creé un jsbin recreándolo para los curiosos: http://emberjs.jsbin.com/tijebi/1
¿@ ef4 todavía planea ver esto?
Lo siento, últimamente está bajo en mi lista de prioridades.
Para que conste, acabo de experimentar el mismo problema
Nos estamos deshaciendo de las URL ansiosas, cerrando a favor si # 9919
En caso de que alguien todavía tenga este problema y requiera una solución _ ahora mismo_:
// app/routes/your-route.js
export default Ember.Route.extend({
// ...
actions: {
willTransition(transition) {
var model = this.controller.get('model');
if (
model.get('hasDirtyAttributes') &&
!confirm("You're going to discard all unsaved changes. Are you sure?")
) {
transition.abort();
// Custom revert of Back button result
var oldURL = this.router.generate(this.routeName, model);
var newURL = this.router.location.getURL();
if (oldURL != newURL) {
this.router.location.setURL(oldURL);
}
} else {
return true;
}
}
}
});
No me gusta usar los métodos this.router.location
directamente, pero es como la única forma de hacerlo en este momento (para manejar _todos los tipos de ubicaciones_)
Acabo de actualizar mi jsbin del año pasado al 1.13.4 y este problema todavía existe: http://emberjs.jsbin.com/lohekasuhu/edit?html , css, js
Puedo confirmar que esto también es un problema con 1.13.11.
Llamar a abort()
en una transición en afterModel
da como resultado que la URL se actualice y la aplicación entre en un estado roto.
Las siguientes llamadas transitionToRoute
no actualizaron correctamente la ruta y la solución anterior ya no funciona porque router.location
no tiene los métodos getURL
y setURL
.
Actualicé el [jsbin de @bcardarella a 2.5.0]. Sigue pasando.
Esto fue solucionado por https://github.com/tildeio/router.js/pull/197 (en 2.10.0-beta.3 +).
Demostración contra v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1
@rwjblue No estoy seguro de que esto esté arreglado para el caso de aborto todavía. Veo este problema en Ember 2.12.0. Cuando hago la transición a una ruta que se cancela en el gancho del modelo, la URL refleja el estado de la aplicación como si la transición no se hubiera cancelado. ¿Otros siguen experimentando este comportamiento de transition#abort
?
@kanderek Sí, acabo de encontrarme con este comportamiento. Aunque estoy en 2.11.3.
Hola,
con ember 2.14, el problema todavía parece estar presente
Experimentando este problema con 2.11.3
Actualmente usando esta fea solución que encontré en stackoverflow
//right after an aborted transition
if (window.history) {
window.history.forward();
}
Por favor, no me avergüences por eso ^
+1
¡Sigo viendo este problema! Estoy en 2.12.2
¿Alguien puede dar un ejemplo erróneo de esto?
@wagenet aquí es un ejemplo usando Ember 3.1.1:
https://github.com/btecu/ember-issues/tree/5210
@SirZach @adamreisnz @bcardarella @bschouwerwou @btecu @cibernox @dkorenblyum @ ef4 @kanderek @kanongil @kottenator @machty @mutewinter @pixelhandler @ rafael-paiva @rwjblue @stefanpenner @wagenet @woprandi o crear una nueva reproducción de esto, ¿qué les parece?
@btecu ¿ podrías actualizar tu ejemplo a Ember 3.5?
+1 Me encuentro con esto ahora también (creo). En nuestro caso, hacemos la transición a una página, luego regresamos usando window.history.go (-1); parece que simplemente continúa cargando la página actual (completando la transición, etc. y cargando el resto del contenido asincrónico), lo que lleva un tiempo, y finalmente hace la transición de regreso. Sin embargo, la URL se actualiza de inmediato. ¿Posiblemente porque usamos la API del historial directamente?
Acabo de experimentar esto con 3.9.1
Este problema es confusa debido a que el fallo original, sin duda lo arreglaran. Ya no hacemos ansiosas actualizaciones de URL. Voy a cerrar porque aquí hay mucha historia irrelevante.
@miguelcobain, si puede compartir su reproducción en 3.9.1 como una nueva edición, le ayudará a recibir la atención adecuada.
Este fue el resultado principal cuando busqué este problema que todavía parece existir, así que pensé en pegar un fragmento actualizado con una solución alternativa para cualquiera que se encuentre con esto (avíseme si hay una solución real que No estoy al tanto de):
<strong i="6">@service</strong> router
<strong i="7">@action</strong>
willTransition(transition) {
if (!transition.to.find(route => route.name === this.routeName) && !confirm('confirm?')) {
transition.abort()
let oldURL = this.router.currentURL;
let newURL = this.router.location.getURL();
if (oldURL != newURL) {
this.router.location.setURL(oldURL);
}
}
return true;
}
Esta es una versión simplificada de la sugerencia que @kottenator dio anteriormente (https://github.com/emberjs/ember.js/issues/5210#issuecomment-122033542).
Comentario más útil
Esto fue solucionado por https://github.com/tildeio/router.js/pull/197 (en 2.10.0-beta.3 +).
Demostración contra v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1