Я не думаю, что это было бы возможно полностью на шаблоне. Это связано с тем, что для доступа к состоянию элемента управления FormArray в вашем шаблоне вам потребуется доступ к this.formGroup.get('features').controls[i].invalid
. Но поскольку get
возвращает экземпляр типа AbstractControl
, у вас не будет доступа к массиву controls
. Для этого вам нужно будет ввести все, что возвращено из this.formGroup.get('features')
в FormArray
. И я не думаю, что это возможно в шаблоне.
Вам нужно будет создать метод в вашем классе, который будет возвращать валидность элемента управления на основе индекса.
Так что, если мы продолжим ссылаться на ваш стек, например, вот как:
<form [formGroup]="formGroup">
<div formArrayName="features">
<div
class="row no-gutters form-group"
*ngFor="let feature of features.controls; let index = index; let last = last">
<input
type="text"
class="form-control px-2 col"
[formControlName]="index"
title="feature"
required>
IS Invalid - {{ getValidity(index) }}
<div class="col-3 col-md-2 row no-gutters">
<button
class="col btn btn-outline-danger"
(click)="removeFeature(index)">
-
</button>
<button
class="col btn btn-success"
*ngIf="last"
(click)="addFeature()">
+
</button>
</div>
</div>
</div>
</form>
А в вашем классе:
import { Component } from '@angular/core';
import { FormArray, FormBuilder, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
constructor(
private fb: FormBuilder,
) {}
formGroup = this.fb.group({
features: this.fb.array([this.fb.control('', Validators.required)])
});
get features(): FormArray {
return this.formGroup.get('features') as FormArray;
}
addFeature(): void {
this.features.push(this.fb.control('', Validators.required));
}
getValidity(i) {
return (<FormArray>this.formGroup.get('features')).controls[i].invalid;
}
removeFeature(index): void {
this.features.removeAt(index);
console.log(this.features);
}
}
UPDATE
Несколько месяцев назад я понял, что вызов метода в одном из синтаксисов привязки данных (т. Е. Интерполяция строки - {{ ... }}
, привязка свойства - [propertyName]="methodName()"
или привязка атрибута - [class.class-name]="methodName()"
ИЛИ [style.styleName]="methodName()"
) Чрезвычайно дорого в плане производительности.
Итак, вы должны сделать это, используя:
{{ formGroup.controls['features'].controls[index].invalid }}
Вместо:
{{ getValidity(index) }}
Вот обновленный Рабочий образец StackBlitz для вашей ссылки.