Учитывая
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
не будет работать по определению, с ошибкой описанным способом.
interface
определяет что-то только в типе пробеле, но не в значении пробеле ипоэтому не имеет никакого проявления во время выполнения вообще.Это означает, что его нельзя использовать в позиции значения.
В сущности, система внедрения зависимостей 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)
, где IPage
- это interface
, имеет неправильный формат.
Основная цель @Inject(ProviderToken)
- дать возможность вводить поставщика ортогонально типу декорированного параметра в таких случаях.как ваш.
Поэтому вам нужно что-то вроде
constructor(@Inject(PageProviderToken) page) {}
Это означает, что нужно определить токен и использовать его для регистрации провайдера, который может быть введен.
Можно и нужно писать по-прежнему
constructor(@Inject(PageProviderToken) page: IPage) {}
, чтобы придать параметру тип, но тип не связан со значением, введенным для параметра.
Например,
import {InjectionToken, NgModule} from '@angular/core';
export const PageProviderToken = new InjectionToken('PageProviderToken');
@NgModule({
providers: [
{
provide: PageProviderToken,
useFactory: anAppropriatePageLikeValue
}
]
}) export class // ...