Как использовать кнопку в качестве элемента управления формой в Angular?

#angular

#angular

Вопрос:

Я использую базовые элементы управления формой для ввода, автозаполнения и т.д. поля, как показано ниже:

 <div *ngSwitchCase="'text'">
    <input matInput type="text" formControlName="{{controlName}}"/>
</div>
 

и теперь мне нужно добавить кнопку в форму, как показано ниже:

 <div *ngSwitchCase="'button'">
    <button mat-button formControlName="{{controlName}}" (click)="create()">Create</button>
</div>
 

Но я сталкиваюсь с ошибкой «Нет средства доступа к значению для элемента управления формой с именем: createEmp» ( createEmp это controlName значение, которое я передаю из компонента). Итак, возможно ли исправить эту ошибку?

Комментарии:

1. Какую реальную проблему вы пытаетесь решить с помощью этого?

Ответ №1:

Фредрик, кнопка не принимает FormControl, но всегда помните: FormControl существует, даже если в .html нет «ввода». Итак, вы можете сделать, например (представьте, что вы определяете FormGroup под названием «форма»)

 <button mat-button [disabled]="form.get(controlName).disabled"
                   (click)="form.get(controlName).setValue("one");
                            form.get(controlName).markAsTouched()">
   Create
</button>
 

Или, как сказал Кевин Занг, создайте пользовательский FormControl

Ответ №2:

Вам необходимо реализовать пользовательский элемент управления реактивной формой для вашей кнопки с помощью интерфейса ControlValueAccessor. Смотрите Эту статью для справки: ссылка

 export class TagsComponent implements ControlValueAccessor {
  onChange: (value: string[]) => void = () => {};
  onTouched: Function = () => {};
  isDisabled = false;
  
  …
  
  writeValue(value: string[]) {
    this.tags = value || [];
  }
  
  registerOnChange(fn: any) {
    this.onChange = fn;
  }
  
  registerOnTouched(fn: any) {
    this.onTouched = fn;
  }
  
  setDisabledState(disabled: boolean) {
    this.isDisabled = disabled;
  }
}
 

Комментарии:

1. Привет, Кевин, спасибо. Я реализую это позже, но мне интересно, могу ли я использовать это без создания пользовательского элемента управления реактивной формой (по крайней мере, на данный момент). Тогда я реализую это позже.

2. Я думаю, что другого способа обработать его нет. Поскольку вы не можете привязать formcontrolname к элементу html ‘none user input’. Реактивные формы используются для обработки пользовательских вводов, а кнопка — нет..