首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在angular2中的每个路由更改上调用一个函数

如何在angular2中的每个路由更改上调用一个函数
EN

Stack Overflow用户
提问于 2017-02-25 07:44:41
回答 4查看 50.2K关注 0票数 39

我的module.ts

代码语言:javascript
复制
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调用一个函数,我如何做that.Can --任何人都请帮助me.Thanks。我的mainapp.ts

代码语言:javascript
复制
    export class Mainapp {

    showBeforeLogin:any = true;
    showAfterLogin:any;
    constructor( public router: Router) {
     this.changeOfRoutes();

     }
     changeOfRoutes(){
      if(this.router.url === '/'){
         this.showAfterLogin = true;
      }
     }
}

我想为每一个路线的改变调用这个changeofRoutes(),怎么做呢?有谁能帮我吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-25 07:55:03

您可以像这样从主activate调用router-outlet方法

代码语言:javascript
复制
<router-outlet  (activate)="changeOfRoutes()"></router-outlet>

每次路线改变的时候都会打电话。

更新-

实现同样目标的另一种方法是订阅路由器事件,甚至可以根据导航状态筛选出它们,例如,开始和结束-

代码语言:javascript
复制
import { Router, NavigationEnd } from '@angular/router';
  
  @Component({...})
  constructor(private router: Router) {
    this.router.events.subscribe((ev) => {
      if (ev instanceof NavigationEnd) { /* Your code goes here on every router change */}
    });
  }
票数 74
EN

Stack Overflow用户

发布于 2017-02-25 08:21:05

您可以订阅路由器的NavigationEnd事件,并使用urlAfterRedirects方法检索URL。

  • 我强烈建议您使用urlAfterRedirects,因为您似乎需要有条件地使用showAfterLogin
  • 比方说,您将/test-page重定向到/,并且依赖于router.url。在这种情况下,应用程序将被重定向到/,但是router.url将返回/test-page,在这里, already comes ('/test-page' != '/')。

简单地,在构造函数中进行以下更改:

代码语言:javascript
复制
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;
                    }
                });
    }
}
票数 6
EN

Stack Overflow用户

发布于 2018-03-16 05:37:34

您可以在下面这样的路由中调用指令:

代码语言:javascript
复制
{ path: 'dashboard', component: DashboardComponent , canActivate: [AuthGuard] },

您的AuthGuard组件如下所示:

auth.guard.ts

代码语言:javascript
复制
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:

代码语言:javascript
复制
......... Your code.......... 
import { AuthGuard } from './_guards/index';
..........Your code..............
  providers: [
    AuthGuard,
    ........
],
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42453375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档