Ember.js: Limpiar URL ansiosas después de abortar

Creado en 22 jul. 2014  ·  28Comentarios  ·  Fuente: emberjs/ember.js

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.

Bug Inactive Needs Submitter Response

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

Todos 28 comentarios

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).

¿Fue útil esta página
0 / 5 - 0 calificaciones