在多个模块中使用具有通用基类的Angular解析器

时间:2018-10-07 20:59:18

标签: angular typescript

我有一个像这样的解析器

@Injectable({ providedIn: 'root' })
export class CandidateResolver implements Resolve<Observable<Candidate>> {
    constructor(private service: CandidateService) {
    }

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Candidate> {
        return this.service.getCandidate(route.params.candidateId);
    }
}

然后我有CandidateService的2个子类

@Injectable({providedIn: 'root'})
    export class AgencyOwnerCandidateService extends CandidateService

 @Injectable({providedIn: 'root'})
    export class RecruiterCandidateService extends CandidateService

我在AgencyOwnerModuleRecruiterModule这两个模块中分别注册了这样的服务。

const routes: Routes = [
    {
        path: ':orgId/agency-owner/candidates/:candidateId',
        component: AgencyOwnerCandidateComponent,
        resolve: {
            candidate: CandidateResolver
        }
    }
];

@NgModule({
    declarations: [
        AgencyOwnerCandidateComponent
    ],
    imports: [
        RouterModule.forChild(routes)
    ],
    providers: [
        {
            provide: CandidateService,
            useClass: AgencyOwnerCandidateService
        }
    ]
})
export class AgencyOwnerCandidatesModule {
}

当我实际运行路线时,它得到了错误的具体类型。我显然明白了为什么,因为所有模块都是基于令牌名称加载模块的。

有什么办法可以像我期望的那样控制用DI加载哪种具体类型吗?

1 个答案:

答案 0 :(得分:0)

您的基本解析器无法标记为@Injectable。

只需删除装饰器,然后将其保留为普通的“纯” TS类即可。