#angular #typescript #angular-reactive-forms
#angular #typescript #angular-reactive-forms
Вопрос:
Пытаюсь реализовать пользовательский formcontrol. У меня установлен строгий режим true
, и я не хочу его удалять. Реализация функций доступа к управляющему значению все работают с необязательной цепочкой, за исключением setDisabledState
. Даже выполнение неявной проверки на возможное значение undefined
не устраняет проблему.
Соответствующий код:
@ViewChild(FormControlDirective, {static: true}) formControlDirective!: FormControlDirective;
@Input() formControl!: FormControl | AbstractControl;
@Input()
formControlName!: string;
get control(): FormControl {
return (this.formControl || this.controlContainer?.control?.get(this.formControlName)) as FormControl;
}
constructor(private controlContainer: ControlContainer) { }
// .... more code
// ISSUE BELOW!!!
setDisabledState(isDisabled: boolean): void {
if (this.formControlDirective amp;amp; this.formControlDirective.valueAccessor) {
this.formControlDirective.valueAccessor.setDisabledState(isDisabled);
}
}
Ошибка:
Cannot invoke an object which is possibly 'undefined'.
Я воспроизвел проблему в этой заметке STACKBLITZ, отключение строгого режима устраняет проблему, и код работает по назначению.
Ответ №1:
setDisabledState
является необязательным свойством в ControlValueAccessor
интерфейсе: https://angular.io/api/forms/ControlValueAccessor
Следовательно, это может быть не функция.
Вы также можете добавить необязательную цепочку к вызову метода, что должно исправить вашу ошибку:
this.formControlDirective?.valueAccessor?.setDisabledState?.(isDisabled);
Комментарии:
1. О, глупый я, спасибо! Был слишком сосредоточен на
formControlDirective.valueAccessor
… вместо того, чтобы фактически сосредоточиться наsetDisabledState
…. туннельном видении: P2. Нет проблем — простая ошибка, поскольку другие свойства функции не являются необязательными 🙂