Ember.js: Limpar URLs ávidos após abortar

Criado em 22 jul. 2014  ·  28Comentários  ·  Fonte: emberjs/ember.js

Atualizações rápidas de URL são boas quando tudo consegue abortar ou fazer a transição no mesmo runloop. Mas abortos e transições podem acontecer em loops de execução subsequentes e, nesse caso, deixamos o aplicativo em um estado quebrado.

No caso de abortar, você acaba com uma URL que não reflete seu estado atual real. Na próxima vez que o usuário pressionar o botão Voltar, nada acontecerá.

No caso de redirecionamento, você quebra o botão Voltar, deixando um estado intermediário no histórico do usuário, o que normalmente o redirecionará de volta.

Discuti isso com @machty e concordamos que seria bom trabalhar nisso. Provavelmente, o roteador pode acompanhar os pushes de URL ansiosos e desenrolá-los com history.back() ou similar quando ocorre um aborto.

Bug Inactive Needs Submitter Response

Comentários muito úteis

Isso foi corrigido por https://github.com/tildeio/router.js/pull/197 (em 2.10.0-beta.3 +).

Demonstração contra v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1

Todos 28 comentários

Eu concordo com esta questão. Estou vendo agora, mesmo que faça um transition.abort() no gancho willTransition da rota. O URL reflete a página para a qual teria ido se a transição não fosse abortada.

: +1:

@ ef4 Eu adoraria que você

Posso trabalhar nisso, mas provavelmente não agora.

: +1: funcionou ao seguir o código de amostra willTransition nos documentos da API. O URL é alterado, embora abort sido chamado.

Eu tenho o mesmo problema. Eu criei um jsbin recriando-o para os curiosos: http://emberjs.jsbin.com/tijebi/1

@ ef4 ainda planeja dar uma olhada nisso?

Desculpe, está no final da minha lista de prioridades.

Só para constar, acabei de passar pelo mesmo problema

Estamos nos livrando de URLs ansiosos, fechando a favor se # 9919

Para o caso de alguém ainda ter esse problema e precisar de uma solução _ agora_:

// 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;
            }
        }
    }
});

Não gosto de usar métodos this.router.location diretamente, mas é a única maneira de fazer isso agora (para lidar com _todos os tipos de locais_)

Acabei de atualizar meu jsbin do ano passado para o 1.13.4 e este problema ainda existe: http://emberjs.jsbin.com/lohekasuhu/edit?html , css, js

Posso confirmar que este ainda é um problema com 1.13.11 também.

Chamar abort() em uma transição em afterModel resulta na atualização do URL e no estado de falha do aplicativo.

As chamadas transitionToRoute subsequentes falharam em atualizar corretamente a rota e a solução alternativa acima não funciona mais, pois router.location não tem os métodos getURL e setURL .

Eu atualizei [jsbin para 2.5.0] 's @bcardarella. Ainda está acontecendo.

Isso foi corrigido por https://github.com/tildeio/router.js/pull/197 (em 2.10.0-beta.3 +).

Demonstração contra v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1

@rwjblue Não tenho certeza se isso foi corrigido para o caso de aborto ainda. Estou vendo esse problema no ember 2.12.0. Quando faço a transição para uma rota que foi abortada no gancho do modelo, a url reflete o estado do aplicativo como se a transição não tivesse sido abortada. Outros ainda estão experimentando o comportamento de transition#abort ?

@kanderek Sim, acabei de encontrar esse comportamento. Estou no 2.11.3.

Oi,
com o ember 2.14, o problema ainda parece estar presente

Enfrentando esse problema com 2.11.3

Atualmente usando esta solução alternativa feia que encontrei no stackoverflow

//right after an aborted transition
if (window.history) {
  window.history.forward();
}

Por favor, não me envergonhe por isso ^

+1

Ainda estou vendo esse problema! Estou no 2.12.2

Alguém pode fornecer um exemplo de falha para isso?

@wagenet aqui está um exemplo 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 isto ainda é um problema, talvez nós deve fechar ou criar uma nova reprodução disso, o que você acha?

@btecu você poderia atualizar seu exemplo para o Ember 3.5?

1 Correndo para isso agora também (eu acho). Em nosso caso, fazemos a transição para uma página e, em seguida, voltamos usando window.history.go (-1) - parece apenas continuar carregando a página atual (completando a transição etc e carregando o restante do conteúdo assíncrono), o que leva um tempo, então eventualmente faz a transição de volta. O url é atualizado imediatamente. Possivelmente porque usamos a API de histórico diretamente?

Acabei de experimentar isso com 3.9.1

Esse problema é confuso porque o bug original definitivamente foi corrigido. Não fazemos mais atualizações ansiosas de URL. Vou encerrar porque há muita história irrelevante aqui.

@miguelcobain se você puder, por favor, compartilhe sua reprodução no 3.9.1 como um novo problema, que o ajudará a receber a devida atenção.

Este foi o principal resultado quando pesquisei esse problema que ainda parece ser uma coisa, então pensei em colar um snippet atualizado com uma solução alternativa para qualquer pessoa que se deparar com isso (por favor, me informe se há uma solução Não estou ciente 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 é uma versão simplificada da sugestão que @kottenator deu acima (https://github.com/emberjs/ember.js/issues/5210#issuecomment-122033542).

Esta página foi útil?
0 / 5 - 0 avaliações