Ответ 1
вы можете вызвать метод activate
из основного router-outlet
, как этот
<router-outlet (activate)="changeOfRoutes()"></router-outlet>
который будет вызывать каждый раз при изменении маршрута
Мой module.ts,
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouterModule,Router } from '@angular/router';
import { AppComponent } from './crud/app.component';
import { Profile } from './profile/profile';
import { Mainapp } from './demo.app';
import { Navbar } from './header/header';
// import {ToasterModule, ToasterService} from 'angular2-toaster';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [ BrowserModule,FormsModule, ReactiveFormsModule ,
RouterModule.forRoot([
{ path: '', component:AppComponent},
{ path: 'login', component:AppComponent},
{ path: 'profile', component:Profile}
]) ],
declarations: [ AppComponent,Mainapp,Navbar,Profile ],
bootstrap: [ Mainapp ]
})
export class AppModule {
}
Здесь я хочу вызвать функцию из main.ts при каждом изменении маршрута и как я могу это сделать. Можете ли я помочь мне. Спасибо. Мой mainapp.ts,
export class Mainapp {
showBeforeLogin:any = true;
showAfterLogin:any;
constructor( public router: Router) {
this.changeOfRoutes();
}
changeOfRoutes(){
if(this.router.url === '/'){
this.showAfterLogin = true;
}
}
}
Я хочу называть это changeofRoutes() для каждого изменения маршрута и как я могу это сделать? Кто-нибудь может мне помочь.
вы можете вызвать метод activate
из основного router-outlet
, как этот
<router-outlet (activate)="changeOfRoutes()"></router-outlet>
который будет вызывать каждый раз при изменении маршрута
Вы можете подписаться на событие NavigationEnd
маршрутизатора и получить URL-адрес с помощью метода urlAfterRedirects
.
Я настоятельно рекомендую вам использовать urlAfterRedirects
, потому что кажется, что вам нужно showAfterLogin
условно.
Скажем, вы перенаправляете /test-page
в /
; и вы полагаетесь на router.url
. В этом случае приложение уже будет перенаправлено на /
, но router.url
вернет /test-page
, и здесь появится проблема ('/test-page' != '/'
).
Просто внесите следующие изменения в свой конструктор:
export class Mainapp {
showBeforeLogin:any = true;
showAfterLogin:any;
constructor(public router: Router) {
this.changeOfRoutes();
this.router.events
.filter(event => (event instanceof NavigationEnd))
.subscribe((routeData: any) => {
if(routeData.urlAfterRedirects === '/') {
this.showAfterLogin = true;
}
});
}
}
Вы можете вызвать директиву в Маршрутах, как показано ниже:
{ path: 'dashboard', component: DashboardComponent , canActivate: [AuthGuard] },
Ваш компонент AuthGuard похож на ниже, где вы помещаете свой код:
auth.guard.ts
import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot,
RouterStateSnapshot } from '@angular/router';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)
{
if (localStorage.getItem('currentUser')) {
// logged in so return true
return true;
}
// not logged in so redirect to login page with the return url
this.router.navigate(['/home'], { queryParams: { returnUrl:
state.url }});
return false;
}
}
Вам необходимо импортировать компонент AuthGuard в файл app.module.ts и предоставить поставщикам:
app.module.ts:
......... Your code..........
import { AuthGuard } from './_guards/index';
..........Your code..............
providers: [
AuthGuard,
........
],
Вы можете обратиться: NgRx Router
Поймайте все действия "Go" в эффектах ngrx, чтобы делать вещи непосредственно перед изменением маршрута, или в редукторе этого действия для вызова функции после изменения маршрута.