1 回答
TA贡献1853条经验 获得超6个赞
给定的
export function UniquePermalinkValidator(pageService: PageService, page: IPage): AsyncValidatorFn {
// ...
}
并给予
@Directive({
selector: '[appUniquePermalink]',
providers: [{ provide: NG_ASYNC_VALIDATORS, useExisting: UniquePermalinkValidatorDirective, multi: true }]
})
export class UniquePermalinkValidatorDirective implements AsyncValidator {
constructor(private pageService: PageService, private page: IPage) {}
// ...
}
鉴于它仅由以下IPage定义
export interface IPage {
id: number;
// ...
}
然后UniquePermalinkValidatorDirective根据定义将无法工作,以描述的方式失败。
Aninterface只在类型空间中定义了一些东西,而不是在值空间中,因此没有任何运行时表现形式。这意味着它不能用于值位置。
本质上,Angular 的依赖注入系统读取构造函数参数的类型,当值空间中有对应命名的声明时,它会使用对应命名的值作为注入标记。
例如,以下
import {Injectable} from '@angular/core';
@Injectable() export class Service {
constructor(http: Http) {}
}
也可以写
import {Inject} from '@angular/core';
export class Service {
constructor(@Inject(Http) http: ThisTypeIsArbitraryWithRespectToInjection) {}
}
这意味着同样的事情
请注意如何Http作为参数传递给Inject. 但是Inject(IPage), where IPageis an interface, 格式错误。
的主要目的@Inject(ProviderToken)是允许在像您这样的情况下将提供者与装饰参数的类型正交地注入。
因此,您需要类似的东西
constructor(@Inject(pageToken) page) {}
这意味着需要定义一个令牌并使用它来注册一个可以注入的提供者。
一个人可以而且应该仍然写
constructor(@Inject(pageToken) page: IPage) {}
为了给参数一个类型,但类型与为参数注入的值无关。
例如
import {InjectionToken, NgModule} from '@angular/core';
export const pageToken = new InjectionToken<IPage>('Page');
@NgModule({
providers: [
{
provide: pageToken,
useFactory: functionReturningAPage
}
]
}) export class // ...
添加回答
举报