Angular 6如何实现canActivateChild

时间:2019-02-08 10:51:34

标签: angular angular-guards

我是Angular身份验证防护的新手。我已经成功集成了身份验证防护,以便登录用户可以访问私有页面。为此,我使用了@Directive({ selector: '[customMax][formControlName],[customMax][formControl],[customMax][ngModel]', providers: [{provide: NG_VALIDATORS, useExisting: CustomMaxDirective, multi: true}] }) export class CustomMaxDirective implements Validator { @Input() customMax: number; validate(c: FormControl): {[key: string]: any} { let v = c.value; return ( v > this.customMax)? {"customMax": true} : null; } 。现在,我的目的是使用另一种保护措施,以防止已登录的用户访问某些私有页面。 从https://www.concretepage.com/angular-2/angular-2-4-route-guards-canactivate-and-canactivatechild-example开始,我知道可以使用CanActivate来达到类似的效果。

canActivateChild文件中,我使用了以下内容:

app-routing.module.ts

const routes: Routes = [ ... { path: 'myaccount', loadChildren: '../module/myaccount/myaccount.module#MyAccountModule',canActivate: [AuthGuard] },...]; 组件下,我还有其他几个子组件。

我在myaccount中写道:

myaccount-routing.module.ts

const routes: Routes = [ ... { path: 'abc', component: AbcComponent, children: [ { path: 'xyz', component: XyzComponent, canActivateChild: [ AuthGuard ] }, ... ] } ]; 下的abc组件中,我在myaccount内写了以下内容:

abc-routing.module.ts

这是我的const routes: Routes = [ ... { path: 'xyz', component: XyzComponent, canActivateChild: [ AuthGuard ]}, ... ];

auth.guard.ts

从浏览器说import { Injectable } from '@angular/core'; import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateChild} from '@angular/router'; import { CommonService } from './../services/common.service'; @Injectable() export class AuthGuard implements CanActivate { private userData:any={}; constructor( private router: Router, private commService : CommonService ) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { ... } canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any { console.log("fired!); return true; } } 到xyz页面时,它应该触发浏览器控制台,但是,我在浏览器控制台中看不到任何文本。 CLI中也没有错误。我刷新了myaccount/abc/xyz页面,但是没有运气。浏览器控制台中没有文本。有想法吗?

1 个答案:

答案 0 :(得分:1)

您在哪里提供AuthGuard ?,在示例中根本没有提供。您可以将其更改为@Injectable({providedIn:'root'})

编辑

看看这个stackblitz,当它有一个父canActivateChild时,就好像canActivate被触发了。如果您需要在特定页面上执行验证,则应在要保护的页面上添加另一个canActivate