Вы точно погрузитесь в глубокий конец, пытаясь создать динамическую реактивную форму в рамках *ngFor
- это непростая задача.Я проведу вас через все, что смогу.
Вам нужно будет создать массив для элементов управления, в вашем конструкторе создайте настройку формы formArrayName
как пустой массив, используя this.formBuild.array([])
... вызовите этовсе, что вы хотите, я просто использовал formArrayName
в демонстрационных целях.
После создания экземпляра формы с помощью пустого массива вызовите this.buildForm()
constructor(private formBuilder: FormBuilder) {
this.thisIsMyForm = new FormGroup({
formArrayName: this.formBuilder.array([])
})
this.buildForm();
}
В вашем buildForm()
итерируйте ваш data[]
и нажимайте элементы управления для каждого индекса, назначая значение по умолчаниюи состояние по умолчанию отключено.
buildForm() {
const controlArray = this.thisIsMyForm.get('formArrayName') as FormArray;
Object.keys(this.data).forEach((i) => {
controlArray.push(
this.formBuilder.group({
name: new FormControl({ value: this.data[i].name, disabled: true }),
type: new FormControl({ value: this.data[i].type, disabled: true })
})
)
})
console.log(controlArray)
}
Обратите внимание: console.log (controlArray.controls) приводит к следующему выводу ... каждый индекс представляет собой группу FormGroup с двумя элементами управления name
и type
0: FormGroup
1: FormGroup
2: FormGroup
В вашем html вам необходимо установить иерархию контейнеров, которая имитирует thisIsMyForm
, который вы только что создали.
- родитель:
thisIsMyForm
- ребенок:
formArrayName
- внук:
i as formGroupName
внукважно, потому что он соответствует журналу консоли controlArray.controls
на предыдущем шаге
<form id="myForm" [formGroup]="thisIsMyForm">
<div [formArrayName]="'formArrayName'">
<mat-card *ngFor="let x of data; let i = index">
<div [formGroupName]="i">
Создание кнопок редактирования и сохранения на основе отключенного состояния элемента управления
<button *ngIf="fomrControlState(i)" (click)="toggleEdit(i)">Enable Edit</button>
<button *ngIf="!fomrControlState(i)" (click)="toggleEdit(i)">Save</button>
Создание методов в компоненте дляполучить индекс в качестве аргумента и обработать логику, чтобы скрыть кнопки и переключать поля ввода, включать и отключать состояние.
toggleEdit(i) {
const controlArray = this.thisIsMyForm.get('formArrayName') as FormArray;
if(controlArray.controls[i].status === 'DISABLED'){
controlArray.controls[i].enable()
}else{
controlArray.controls[i].disable()
}
}
fomrControlState(i){
const controlArray = this.thisIsMyForm.get('formArrayName') as FormArray;
return controlArray.controls[i].disabled
}
Отправить кнопку, в которой console.log будет значением формы при нажатии ... также отключить кнопку, когда любой извходные данные формы управления находятся во включенном состоянии.
<button [disabled]="thisIsMyForm.get('formArrayName').enabled" (click)="onSubmit()">Submit Form</button>
onSubmit() {
// Here I would like to be able to access the values of the 'forms'
console.log(this.thisIsMyForm.value)
}
Stackblitz
https://stackblitz.com/edit/dynamic-form-ngfor-otbuzn?embed=1&file=src/app/app.component.ts