如果要在this.router.navigate(['someRoute'])
中执行ngOnInit
,则在重定向之前仍会呈现初始组件。
例如,我有一些组件:
@Component({
selector: 'my-app',
template: '<child-comp></child-comp>',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
constructor(private router: Router) {
}
ngOnInit() {
console.log('ngOnInit from AppComponent');
this.router.navigate(['another']);
}
}
它在模板中包含子项:
@Component({
selector: 'child-comp',
template: '<div>CHILD<div>'
})
export class ChildComponent {
ngOnInit() {
console.log('Should NOT be called (ChildComponent)');
}
}
在视图初始化之前(在ngOnInit
钩内),我将重定向到另一个组件:
@Component({
selector: 'another-comp',
template: '<div>Another<div>'
})
export class AnotherComponent {
ngOnInit() {
console.log('Should be called (AppComponent)');
}
}
我希望子组件不会被初始化,因为它在重定向调用之后发生,但是它的ngOnInit()
钩子仍然被触发。
在这种情况下如何防止子组件初始化?
Stackblitz: https://stackblitz.com/edit/angular-gjunnr?file=src%2Fapp%2Fanother%2Fanother.component.ts
答案 0 :(得分:3)
这是警卫的目的:
创建一个保护措施,确定是否允许用户访问该页面:
@Injectable({
providedIn: 'root'
})
export class PreventNavigateGuard implements CanActivate {
constructor(public router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
):
| Observable<boolean | UrlTree>
| Promise<boolean | UrlTree>
| boolean
| UrlTree {
return this.router.createUrlTree(["another"]);
}
}
然后在您的路线中使用canActivate对其进行保护:
const appRoutes: Routes = [
{ path: '', component: AppComponent, canActivate: [PreventNavigateGuard] },
{ path: 'another', component: AnotherComponent },
];
答案 1 :(得分:0)
或者,您可以仅将ngIf
应用于子组件,并且仅在app.component
中的属性为true时才呈现它。
<child-comp *ngIf="false"></child-comp>