我正在使用Typescript学习Angular2,但我遇到了问题。
我有两个相同界面的classe。如何将它们作为列表注入服务?
我读过opaquetoken https://angular.io/docs/ts/latest/guide/dependency-injection.html#opaquetoken
但我不知道我是否需要使用它以及如何使用它。
export interface CheckerInterface {
check(text : string) : boolean
}
export class Checker1 implements CheckerInterface {
check(text : string) : boolean {
//do something
return true;
}
export class Checker2 implements CheckerInterface {
check(text : string) : boolean {
//do something
return true;
}
@Injectable()
export class Service {
constructor(private checkers: CheckerInterface[]) { //??
checkers.foreach( checker => checker.check(somestring));
}
}
感谢您的帮助!
答案 0 :(得分:1)
您需要将数组添加为提供程序,或在multi: true
配置中使用provider
。
export const CHECKERS = new OpaqueToken('one');
@NgModule({
providers: [
{ provide: CHECKERS, useValue: [new Checker1(), new Checker2()] },
]
})
或
@NgModule({
providers: [
{ provide: CHECKERS, useClass: Checker1, multi: true },
{ provide: CHECKERS, useClass: Checker2, multi: true },
]
})
第二个可能更好,因为你让Angular创建它们,如果需要的话允许它们注入自己的依赖项。
然后,您只需在注入时使用CHECKERS
令牌
import { Inject } from '@angular/core';
import { CHECKERS } from './wherever';
constructor(@Inject(CHECKERS) private checkers: CheckerInterface[]) {