Вставить экземпляр AbstractControlDirective как @ContentChild в настраиваемую директиву

У меня есть такой контроль формы:

<input formControlName="myName" dynamicDisable>

Затем настраиваемая директива:

 @Directive({
    selector: '[formControlName][dynamicDisable]
 })
 export class DynamicDisableDirective implements AfterContentInit {

      @ContentChild(AbstractControlDirective) control: any;

      ngAfterContentInit(): void {
        console.log(this.control);
      }
    }

Я хотел бы добавить в директиву элемент владельца директивы как @ContentChild. Элементами-владельцами могут быть любой тип элемента управления формы, например простой FormControl, FormGroup или даже FormArray. FormControlName является потомком AbstractControlDirective. Почему тогда консоль всегда регистрирует undefined?

Примечание: когда я переключаю AbstractControlDirective на NgControl следующим образом:

@ContentChild(NgControl) control: any;

все работает, как ожидалось, экземпляр элемента управления формой вводится и хорошо регистрируется. Однако этот подход можно использовать только для простого FormControl, но не также для групп и массивов.


person witcher    schedule 12.09.2017    source источник


Ответы (1)


Насколько мне известно, в качестве AbstractControlDirective ничего не предусмотрено, поэтому запрос или внедрение не будут работать без дополнительной помощи.

Я не пробовал, но может сработать регистрация поставщиков псевдонимов, таких как

@Directive({
    selector: '[formControlName][dynamicDisable],
    providers: [
     { provide: AbstractControlDirective, useExisting: FormControl, useMulti: true },
     { provide: AbstractControlDirective, useExisting: FormGroup, useMulti: true },
    ]
})

С useMulti: true вы можете (для всех) получить список, если есть более одного соответствия, а затем отфильтровать список по тому, что вы действительно хотите.

person Günter Zöchbauer    schedule 12.09.2017
comment
Если я предоставлю AbstractControlDirective таким образом, я получаю эту ошибку: core.es5.js:1020 ERROR Error: Uncaught (in promise): Error: No provider for FormGroup! - person witcher; 12.09.2017
comment
Понятно. Думаю, тогда тебе следует использовать useMulti. - person Günter Zöchbauer; 12.09.2017
comment
На самом деле я не уверен, что это сработает. Подход пришел из stackoverflow.com/questions/39366869/. Другой подход - ввести или запросить каждый из них (используя конкретный класс) и проверить, какой из них был найден. - person Günter Zöchbauer; 12.09.2017
comment
useMulti не будет скомпилирован, вероятно, он устарел (v4.3.3), и теперь нам нужно использовать только multi. Однако это не помогло, та же ошибка. - person witcher; 12.09.2017
comment
Я использую второй подход, о котором вы упомянули, но это большой объем кода, было бы лучше, если бы я мог использовать только общий абстрактный класс. - person witcher; 12.09.2017
comment
Если подход с useMulti не работает, вероятно, нет способа сделать это. DI не поддерживает и не обрабатывает информацию о подклассах. (@ViewChild и @ContentChild также основаны на DI) - person Günter Zöchbauer; 12.09.2017