Eu estou olhando para detectar uma mudança de rota no meu AppComponent
.
Posteriormente, irei verificar o token de usuário global para ver se ele está logado. Em seguida, posso redirecionar o usuário se ele não estiver logado.
No Angular 2, você pode subscribe
(evento Rx) em uma instância do roteador. Então você pode fazer coisas como
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
Editar (desde rc.1)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
Edição 2 (desde 2.0.0)
veja também: Router.events doc
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
event._root.children[0].value._routeConfig.data
Espero que não pode haver melhor maneirafilter
operador RxJS .router.events.pipe(filter(e => e instanceof NavigationEnd).subscribe((e) => { ... }
RxJS 6
Agradecimentos a Peilonrayz (veja os comentários abaixo)
novo roteador> = RC.3
Você também pode filtrar pelo evento especificado:
Usar o
pairwise
operador para obter o evento anterior e atual também é uma boa ideia. https://github.com/angular/angular/issues/11268#issuecomment-244601977fonte
Argument of type '(event: Event) => void' is not assignable to parameter of type
Argument of type '(event: Event) => void' is not assignable to parameter of type
erro ocorre porque, no snippet de filtro, você está inscrevendo-se em um objeto do tipo Event em vez de NavigationEvent.Para o Angular 7, alguém deve escrever como:
this.router.events.subscribe((event: Event) => {})
Um exemplo detalhado pode ser o seguinte:
fonte
Angular 7 , se você quiser
subscribe
pararouter
fonte
Angular 4.xe acima:
Isso pode ser alcançado usando a propriedade url da classe ActivatedRoute como abaixo,
Nota: Você precisa importar e injetar o provedor do
angular/router
pacotee
fonte
O roteador 3.0.0-beta.2 deve ser
fonte
No angular 6 e RxJS6:
fonte
import {Router, NavigationEnd} from "@angular/router"
As respostas aqui estão corretas
router-deprecated
. Para a versão mais recente dorouter
:ou
Para ver a diferença entre os dois, confira esta pergunta SO .
Editar
Para o mais recente, você deve fazer:
fonte
router
foi atualizado novamente (ainda não atualizei minha resposta), por isso não tenho certeza de como é o último. Pelorouter
que escrevi sobre, você não pôde. @aknNo Angular 8 você deve fazer como
this.router.events.subscribe((event: Event) => {})
Exemplo:
fonte
No componente, você pode tentar o seguinte:
fonte
fonte
Localização funciona ...
fonte
acima a maioria das soluções está correta, mas estou enfrentando um problema que é emitido várias vezes 'Navigation emit' event.when eu alterei qualquer rota, esse evento é acionado. Portanto, ouça é a solução completa para o Angular 6.
fonte
A resposta do @Ludohen é ótima, mas caso você não queira usar,
instanceof
use o seguintedessa maneira, você pode verificar o nome do evento atual como uma sequência e, se o evento ocorreu, pode fazer o que planejou sua função.
fonte
Event
tipo está causando um erro no Atom, é por isso que não o useiinstanceOf
esse código para que seu exemplo funcione também no código de produção.if(event instanceOf NavigationStart) {
if(event instanceof NavigationStart)
Estou trabalhando com o aplicativo angular5 e estou enfrentando o mesmo problema. Quando passo pela documentação angular, eles fornecem a melhor solução para lidar com os eventos do roteador. verifique a documentação a seguir.
Eventos de roteador em eventos de rota angular em angular5
Mas, especificamente para o caso, em questão, precisamos do NavigationEnd Event
Evento final de navegação angular
Como usar isso?
Quando usar isso?
No meu caso, meu aplicativo compartilha um painel comum para todos os usuários, como usuários, Admins, mas preciso mostrar e ocultar algumas opções da barra de navegação conforme os tipos de usuário.
É por isso que sempre que a URL muda, eu preciso chamar o método de serviço, que retorna as informações do usuário logadas conforme a resposta, irei para outras operações.
fonte
O seguinte TIPO de obras e pode ser complicado para você.
Infelizmente, isso redireciona mais tarde no processo de roteamento do que eu gostaria. O
onActivate()
componente de destino original é chamado antes do redirecionamento.Existe um
@CanActivate
decorador que você pode usar no componente de destino, mas este é a) não centralizado eb) não se beneficia dos serviços injetados.Seria ótimo se alguém pudesse sugerir uma maneira melhor de autorizar centralmente uma rota antes que ela seja confirmada. Tenho certeza de que deve haver uma maneira melhor.
Este é o meu código atual (como eu o alteraria para ouvir a alteração de rota?):
fonte
Eu faço assim desde RC 5
fonte
Basta fazer alterações no AppRoutingModule como
fonte
Angular 8. Verifique se a rota atual é a rota base .
fonte
Eu escreveria algo assim:
fonte
resposta simples para o Angular 8. *
fonte