【发布时间】:2022-01-20 11:36:37
【问题描述】:
想象一个服务ABService 有一个方法isAResponsible: () => boolean 和两个模块:AModule 和BModule。
问题是:是否可以根据isAResponsible 返回的内容在AModule 和BModule 之间切换?如果isAResponsible 的值发生变化,我们如何“重新路由”并重新渲染? ABService 可能对其他服务有多个依赖项,因此最好以某种方式使用 DI 系统。
示例:
如果感兴趣的路由是/aorb 并且ABService.isAResponsible 返回true,那么我们希望路由AModule。如果ABService.isAResponsible 返回false 但是我们希望BModule 管理进一步的路由。请注意,一切都应该发生在 shared 路线上。
我用警卫和canActivate/canLoad试过但没有成功:
app.module.ts
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { AorBActivateGuard } from './aorb-activate.guard';
import { ABService } from './ab.service';
@NgModule({
imports: [
BrowserModule,
RouterModule.forRoot([
{
path: 'aorb',
canActivate: [AorBActivateGuard],
loadChildren: () => import('./a/a.module').then((m) => m.AModule),
},
{
path: 'aorb',
loadChildren: () => import('./b/b.module').then((m) => m.BModule),
},
]),
],
providers: [AorBActivateGuard, ABService],
declarations: [AppComponent],
bootstrap: [AppComponent],
})
export class AppModule {}
ab.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class ABService {
private aIsResponsible = true;
constructor() {}
switch() {
this.aIsResponsible = !this.aIsResponsible;
}
isAResponsible() {
return this.aIsResponsible;
}
}
aorb-activate.guard.ts
import { Injectable } from '@angular/core';
import {
CanActivate,
ActivatedRouteSnapshot,
RouterStateSnapshot,
} from '@angular/router';
import { Observable } from 'rxjs';
import { ABService } from './ab.service';
@Injectable()
export class AorBActivateGuard implements CanActivate {
constructor(private abService: ABService) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
return this.abService.isAResponsible();
}
}
【问题讨论】: