Внедрение угловых зависимостей - использовать Existing of T? - PullRequest
0 голосов
/ 27 августа 2018

Я пишу очень простую директиву, которая, по сути, позволяет мне указывать на другой экземпляр класса в качестве поставщика (не спрашивайте меня почему, я знаю, что это глупо, но это не главное). Поэтому я использую «useExisting» в декларации провайдеров. Это работает, конечно, но я бы не хотел создавать директиву для каждого класса T.

Есть ли способ сделать что-то вроде этого:

@Directive({
  selector: '[appMyGenericDirective]',
  providers: [{provide: NG_VALIDATORS, useExisting: T, multi: true}]
})
export class MyGenericDirective<T> {

}

Где "T" - это класс, который я хочу использовать useExisting?

1 Ответ

0 голосов
/ 27 августа 2018

Ну, так или иначе шаблон HTML должен указывать T. Если вы не хотите объявлять отдельную директиву для каждого T, вы можете попробовать объявить одну директиву, которая принимает T как @Input():

@Directive({
  selector: '[freakyValidator]',
  providers: [{provide: NG_VALIDATORS, useFactory: (freaky) => freaky.validator, deps:[FreakyValidatorDirective], multi: true}]
})
export class FreakyValidatorDirective {
  constructor(private injector: Injector) {}

  @Input()
  set freakyValidator(validatorClass) {
    this.validator = this.injector.get(validatorClass);
  }

  validator: Validator;
}

(предыдущий код не проверен, я немного не уверен, инициализируется ли сначала директива или ее поставщик. Но, вероятно, стоит попробовать)

...