Estou usando o angular 2 com estratégia de hashlocation.
O componente é carregado com essa rota:
"departments/:id/employees"
Até agora tudo bem.
Depois de salvar em lote com êxito várias linhas da tabela editada, desejo recarregar o URL da rota atual via:
this.router.navigate([`departments/${this.id}/employees`]);
Mas nada acontece, por quê?
Respostas:
Se o seu navegador () não alterar o URL que já é mostrado na barra de endereços do seu navegador, o roteador não terá nada para fazer. Não é tarefa do roteador atualizar os dados. Se você deseja atualizar os dados, crie um serviço injetado no componente e chame a função de carregamento no serviço. Se os novos dados forem recuperados, ele atualizará a visualização por meio de ligações.
fonte
Agora isso pode ser feito no Angular 5.1 usando a
onSameUrlNavigation
propriedade de configuração do roteador.Eu adicionei um blog explicando como aqui, mas a essência é a seguinte
https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
Na
onSameUrlNavigation
opção de configuração do roteador , defina-a como'reload'
. Isso faz com que o roteador inicie um ciclo de eventos quando você tenta navegar para uma rota que já está ativa.Nas definições de rota, defina
runGuardsAndResolvers
comoalways
. Isso instruirá o roteador a sempre iniciar os ciclos de guardas e resolvedores, disparando eventos associados.Finalmente, em cada componente que você deseja ativar o recarregamento, você precisa manipular os eventos. Isso pode ser feito importando o roteador, vinculando-se aos eventos e chamando um método de inicialização que redefine o estado do seu componente e busca novamente os dados, se necessário.
Com todas essas etapas, você deve ter o recarregamento de rota ativado.
fonte
init
função,init
?Crie uma função no controlador que redirecione para a rota esperada da seguinte maneira
então use-o assim
essa função será redirecionada para uma rota fictícia e retornará rapidamente à rota de destino sem que o usuário perceba.
fonte
'/'
em vez de'/DummyComponent'
EDITAR
Para versões mais recentes do Angular (5.1+), use a resposta sugerida por @Simon McClive
Resposta antiga
Encontrei esta solução alternativa em uma solicitação de recurso do GitHub para Angular:
Tentei adicionar isso à minha função app.component.ts
ngOnInit
e com certeza funcionou. Todos os cliques adicionais no mesmo link agora recarregam oscomponent
dados e.Link para solicitação de recurso original do GitHub
O crédito vai para mihaicux2 no GitHub.
Eu testei isso na versão
4.0.0-rc.3
comimport { Router, NavigationEnd } from '@angular/router';
fonte
Pouco complicado: use o mesmo caminho com alguns parâmetros fictícios. Por exemplo-
fonte
this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });
eroute.queryParams.subscribe(val => myRefreshMethod())
onderoute: ActivatedRoute
é injetado no componente refrescado ... Espero que ajudeEstou usando este para o projeto Angular 9:
PS: Testado e funciona também em "Angular 7, 8"
fonte
Corte de recarga de rota angular 2-4
Para mim, usar esse método dentro de um componente raiz (componente presente em qualquer rota) funciona:
fonte
Isso funciona para mim como um encanto
fonte
Na mudança de parâmetros, a página de recarga não acontecerá. Este é realmente um bom recurso. Não há necessidade de recarregar a página, mas devemos alterar o valor do componente. O método paramChange chamará a alteração de URL. Para que possamos atualizar os dados do componente
fonte
Foi o que fiz com o Angular 9 . Não tenho certeza se isso funciona em versões mais antigas.
Você precisará ligar para isso quando precisar recarregar.
O roteador forRoot precisa ter o SameUrlNavigation definido como 'recarregar'
E todas as suas rotas precisam ter runGuardsAndResolvers definido como 'always'
fonte
Para mim, trabalha com codificação
fonte
Tanto quanto sei, isso não pode ser feito com o roteador no Angular 2. Mas você pode simplesmente fazer:
Para recarregar a exibição.
fonte
Encontrou uma solução rápida e direta que não requer mexer com o funcionamento interno da angular:
Basicamente: basta criar uma rota alternativa com o mesmo módulo de destino e alternar entre eles:
E aqui o menu de alternância:
Espero que ajude :)
fonte
Um pouco hardcore, mas
fonte
No meu caso:
trabalho correto
fonte
implemente OnInit e chame ngOnInit () no método route.navigate ()
Veja um exemplo:
fonte
Resolveu um cenário semelhante usando um componente fictício e rota para
reload
, o que realmente faz aredirect
. Definitivamente, isso não cobre todos os cenários de usuário, mas apenas funcionou para o meu cenário.O roteamento é conectado para capturar todos os URLs usando um curinga:
Para usar isso, basta adicionar recarregar ao URL para onde queremos ir:
fonte
Existem diferentes abordagens para atualizar a rota atual
Alterar o comportamento do roteador (Desde o Angular 5.1) Defina os roteadores onSameUrlNavigation como 'recarregar'. Isso emitirá os eventos do roteador na mesma navegação por URL.
Deixe o roteador intocado
Escrevi uma explicação mais detalhada em https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e
Espero que isto ajude.
fonte
Suponha que a rota do componente que você deseja atualizar seja
view
e use o seguinte:você pode adicionar um
debugger
método interno para saber qual é a rota exata depois de navegar para"departments/:id/employees"
.fonte
Uma solução é passar um parâmetro fictício (ou seja, o tempo em segundos), dessa maneira o link é sempre recarregado:
fonte
Estou usando
setTimeout
enavigationByUrl
para resolver esse problema ... E está funcionando bem para mim.Ele é redirecionado para outro URL e, em vez disso, volta novamente ao URL atual ...
fonte
Eu acredito que isso foi resolvido (nativamente) no Angular 6+; Verifica
aqui https://github.com/angular/angular/issues/13831 &&
e aqui https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
Mas isso funciona para uma rota inteira (inclui também todas as rotas secundárias)
Se você deseja segmentar um único componente, veja como: Use um parâmetro de consulta que seja alterado para poder navegar quantas vezes quiser.
No ponto de navegação (classe)
No componente que você deseja "atualizar / recarregar"
fonte
Muito frustrante que o Angular ainda não pareça incluir uma boa solução para isso. Eu levantei um problema no github aqui: https://github.com/angular/angular/issues/31843
Enquanto isso, essa é minha solução alternativa. Ele se baseia em algumas das outras soluções sugeridas acima, mas acho que é um pouco mais robusto. Envolve agrupar o serviço Roteador em um "
ReloadRouter
", que cuida da funcionalidade de recarregamento e também adiciona umRELOAD_PLACEHOLDER
à configuração do roteador principal. Isso é usado para a navegação provisória e evita o acionamento de outras rotas (ou guardas).Nota: Use somente
ReloadRouter
nesses casos quando desejar a funcionalidade recarregar. Use o normalRouter
caso contrário.fonte
Importar
Router
eActivatedRoute
de@angular/router
Injetar
Router
eActivatedRoute
(caso você precise de algo do URL)Obtenha qualquer parâmetro, se necessário, a partir do URL.
Usar um truque navegando para um URL fictício ou principal e depois para o URL real atualizará o componente.
No seu caso
Se você usar uma rota fictícia, verá um título piscando 'Não encontrado' se tiver implementado um URL não encontrado, caso não corresponda a nenhum URL.
fonte
assinar alterações de parâmetro de rota
fonte
Se você estiver alterando a rota via Link do roteador, siga este procedimento:
fonte
Você deve usar a propriedade "onSameUrlNavigation" no RouterModule e assinar os eventos de rota https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e
fonte
Decide quando a rota deve ser armazenada, retorne false para
e defina o valor navegado do roteador como false, que mostra que essa rota nunca foi roteada
fonte
Eu tentei algumas correções e nenhuma delas funciona. Minha versão é simples: adicione um novo parâmetro não utilizado aos parâmetros de consulta
fonte
window.location.replace
// use backtick para incluir a rota
window.location.replace (
departments/${this.id}/employees
)fonte