Suponha que eu esteja atualmente na página que contém o URL /user/:id
. Agora, a partir desta página, navego para a próxima página :id/posts
.
Agora existe uma maneira, para que eu possa verificar qual é a URL anterior, ou seja /user/:id
.
Abaixo estão minhas rotas
export const routes: Routes = [
{
path: 'user/:id', component: UserProfileComponent
},
{
path: ':id/posts', component: UserPostsComponet
}
];
angular
angular2-routing
Chandra Shekhar
fonte
fonte
null
porque não existe uma rota anterior. Você também precisa fazer isso no roteador raiz, caso contrário, você só obterá quando navegar entre as rotas secundárias deste componente.Talvez todas as outras respostas sejam para angular 2.X.
Agora não funciona para o angular 5.X. Estou trabalhando nisso.
com apenas NavigationEnd, você não pode obter url anterior.
porque o roteador funciona de "NavigationStart", "RoutesRecognized", ..., para "NavigationEnd".
Você pode verificar com
Mas ainda assim você não pode obter url anterior, mesmo com "NavigationStart".
Agora você precisa usar os pares.
Com o emparelhamento, você pode ver de e para onde é o url.
"RoutesRecognized" é a etapa de mudança da origem para o URL de destino.
então filtre-o e obtenha o URL anterior dele.
Por último mas não menos importante,
coloque este código no componente pai ou superior (por exemplo, app.component.ts)
porque este código dispara após terminar o roteamento.
Atualizar angular 6+
O
events.filter
dá erro porque o filtro não faz parte dos eventos, então mude o código parafonte
subscribe()
em um campo e o chamaunsubscribe()
emngOnDestroy()
. Deve haver severs. perguntas com exemplos sobre cancelamento de inscrição aqui no SO.Crie um serviço injetável:
import { Injectable } from '@angular/core'; import { Router, RouterEvent, NavigationEnd } from '@angular/router'; /** A router wrapper, adding extra functions. */ @Injectable() export class RouterExtService { private previousUrl: string = undefined; private currentUrl: string = undefined; constructor(private router : Router) { this.currentUrl = this.router.url; router.events.subscribe(event => { if (event instanceof NavigationEnd) { this.previousUrl = this.currentUrl; this.currentUrl = event.url; }; }); } public getPreviousUrl(){ return this.previousUrl; } }
Em seguida, use-o onde você precisar. Para armazenar a variável atual o mais rápido possível, é necessário usar o serviço no AppModule.
// AppModule export class AppModule { constructor(private routerExtService: RouterExtService){} //... } // Using in SomeComponent export class SomeComponent implements OnInit { constructor(private routerExtService: RouterExtService, private location: Location) { } public back(): void { this.location.back(); } //Strange name, but it makes sense. Behind the scenes, we are pushing to history the previous url public goToPrevious(): void { let previous = this.routerExtService.getPreviousUrl(); if(previous) this.routerExtService.router.navigateByUrl(previous); } //... }
fonte
@NgModule({ ..., providers: [RouterExtService]}) export class AppRoutingModule { }
routerExtService.getPreviousUrl()
método no construtor de um serviço usado em um componente. Por algum motivo, ele é chamado antes da atualização real. O que significa que temos uma dependência de tempo! Eu acho que é muito mais fácil usar o Assunto.let params = new HttpParams({fromString: retrieveURL}).set('name', 'victor') const paramsObject = params.keys().reduce((obj, key) => { obj[key] = params.get(key) return obj }, {}) this.router.navigate([paramsObject], { relativeTo: this.route })
Código atualizado do Angular 6 para obter o URL anterior como string.
fonte
Isso funcionou para mim nas versões angular> = 6.x:
fonte
Estou usando o Angular 8 e a resposta de @franklin-pious resolve o problema. No meu caso, obter o url anterior dentro de uma assinatura causa alguns efeitos colaterais se estiver anexado a alguns dados na visualização.
A solução alternativa que usei foi enviar o url anterior como um parâmetro opcional na navegação da rota.
E para obter esse valor no componente:
this.router e this.route são injetados dentro do construtor de cada componente e são importados como membros @ angular / router.
fonte
Angular 8 e rxjs 6 na versão 2019
Eu gostaria de compartilhar a solução com base em outras grandes soluções.
Primeiro, faça um serviço para escutar as alterações de rotas e salve a última rota anterior em um Assunto de comportamento, em seguida, forneça este serviço no app.component principal no construtor e use este serviço para obter a rota anterior que você deseja, sempre que quiser.
Caso de uso: você deseja redirecionar o usuário para uma página de anúncio e, em seguida, redirecioná-lo automaticamente para o lugar de onde ele veio, então você precisa da última rota anterior para fazer isso.
// service : route-events.service.ts import { Injectable } from '@angular/core'; import { Router, RoutesRecognized } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { filter, pairwise } from 'rxjs/operators'; import { Location } from '@angular/common'; @Injectable() export class RouteEventsService { // save the previous route public previousRoutePath = new BehaviorSubject<string>(''); constructor( private router: Router, private location: Location ) { // ..initial prvious route will be the current path for now this.previousRoutePath.next(this.location.path()); // on every route change take the two events of two routes changed(using pairwise) // and save the old one in a behavious subject to access it in another component // we can use if another component like intro-advertise need the previous route // because he need to redirect the user to where he did came from. this.router.events.pipe( filter(e => e instanceof RoutesRecognized), pairwise(), ) .subscribe((event: any[]) => { this.previousRoutePath.next(event[0].urlAfterRedirects); }); } }
fornecer o serviço em app.module
Injete-o em app.component
constructor( private routeEventsService: RouteEventsService )
finalmente use a rota anterior salva no componente que você deseja
onSkipHandler(){ // navigate the user to where he did came from this.router.navigate([this.routeEventsService.previousRoutePath.value]); }
fonte
@Injectable({ providedIn: 'root' })
o serviço é carregado automaticamente no módulo raiz (AppModule) do projeto e, portanto, você não precisa fornecê-lo manualmente aoapp.module
. Veja a documentação para detalhes. Não é necessário cancelar a assinatura do roteador Observáveis conforme declarado nesta respostaPARA ANGULAR 7+
Na verdade, desde o Angular 7.2 não há necessidade de usar um serviço para salvar a url anterior. Você poderia apenas usar o objeto de estado para definir o último url antes de vincular à página de login. Aqui está um exemplo de um cenário de login.
@Component({ ... }) class SomePageComponent { constructor(private router: Router) {} checkLogin() { if (!this.auth.loggedIn()) { this.router.navigate(['login'], { state: { redirect: this.router.url } }); } } }
----------------@Component({...}) class LoginComponent { constructor(private router: Router) {} backToPreviousPage() { const { redirect } = window.history.state; this.router.navigateByUrl(redirect || '/homepage'); } }
Além disso, você também pode passar os dados no modelo:
@Component({ template: '<a routerLink="/some-route" [state]="{ redirect: router.url}">Go to some route</a>' }) class SomePageComponent { constructor(public router: Router) {} }
fonte
@ GünterZöchbauer também você pode salvá-lo no armazenamento local, mas eu não prefiro) melhor salvar no serviço e obter esse valor de lá
fonte
Você pode usar o Local conforme mencionado aqui .
Este é o meu código se o link abrir em uma nova guia
Importações necessárias
fonte
Bastante simples usando
previousNavigation
objeto:fonte
Tive dificuldade para acessar o url anterior dentro de um guarda.
Sem implementar uma solução personalizada, esta está funcionando para mim.
public constructor(private readonly router: Router) { }; public ngOnInit() { this.router.getCurrentNavigation().previousNavigation.initialUrl.toString(); }
O url inicial será a página de url anterior.
fonte
Esta solução simples funcionou para mim.
fonte
Toda a ANSWER acima será carregada URL várias vezes. Se o usuário visitou qualquer outro componente também, esse código será carregado.
Portanto, é melhor usar o conceito de criação de serviço. https://community.wia.io/d/22-access-the-previous-route-in-your-angular-5-app
Isso funcionará bem em todas as versões do Angular. (certifique-se de adicioná-lo à matriz de fornecedores em seu arquivo app.module!)
fonte
Usando pairwise do rxjx, você pode conseguir isso mais facilmente. importar {filtro, par a par} de 'rxjs / operadores';
}
fonte
Tive um problema semelhante quando quis voltar à página anterior. A solução foi mais fácil do que eu poderia imaginar.
E ele retorna ao url pai. Espero que ajude alguém;)
fonte