Как вызвать функцию при каждом изменении маршрута в угловом2

Мой 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() для каждого изменения маршрута и как я могу это сделать? Кто-нибудь может мне помочь.

Ответ 1

вы можете вызвать метод activate из основного router-outlet, как этот

<router-outlet  (activate)="changeOfRoutes()"></router-outlet>

который будет вызывать каждый раз при изменении маршрута

Ответ 2

Вы можете подписаться на событие 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;
                    }
                });
    }
}

Ответ 3

Вы можете вызвать директиву в Маршрутах, как показано ниже:

{ 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,
    ........
],

Ответ 4

Вы можете обратиться: NgRx Router

Поймайте все действия "Go" в эффектах ngrx, чтобы делать вещи непосредственно перед изменением маршрута, или в редукторе этого действия для вызова функции после изменения маршрута.