Angular 4 数组验证
Angular 4 array validation
我需要有关formArray
反应形式 验证的帮助。我想验证数组中的每个项目,但我不知道该怎么做。谢谢。
html代码:
<label for="name">name:</label>
<input formControlName="name" id="name" type="text">
<div *ngIf="name.invalid && (name.dirty || name.touched)">
<div *ngIf="name.errors.required">
required
</div>
</div>
TypeScript 代码:
createForm() {
this.form = this.fb.group({
person: this.fb.array([this.initItemRows()])
});
}
initItemRows() {
return this.fb.group({
name: [''],
info: ['']
});
}
addNewRow() {
const control = <FormArray>this.form.controls['person'];
control.push(this.initItemRows());
}
deleteRow(index: number) {
const control = <FormArray>this.form.controls['person'];
control.removeAt(index);
}
get name() { return this.form.get('person.name'); }
get info() { return this.form.get('person.info'); }
我试过这个:
initItemRows() {
return this.fb.group({
name: ['', Validators.required ],
info: ['', Validators.required ]
});
}
没用..
你的 name
和 info
的 getter 实际上并不针对特定的表单控件,因为你的 person
是一个 formArray,例如 this.form.get('person.name');
不存在在你的表格中。您需要做的是对每个表单组使用迭代并使用其控件定位该组,因此您的模板应如下所示:
<div *ngFor="let p of form.controls.person.controls; let i = index"
[formGroupName]="i">
<label for="name">name:</label>
<input formControlName="name" id="name" type="text">
<!-- check if the name in this group has the error -->
<div *ngIf="p.controls.name.dirty">
<div *ngIf="p.hasError('required', 'name')">Required</div>
</div>
</div>
另外一个建议是,你可以稍微缩短你的代码并删除一个 initializing/adding formgroup 不需要的方法到你的数组,所以我在这里删除了 addNewRow
, initItemRows
可以在需要添加新行时调用。
this.form = this.fb.group({
person: this.fb.array([])
});
this.initItemRows();
initItemRows() {
let ctrl = <FormArray>this.form.controls.person;
ctrl.push(this.fb.group({
name: ['', Validators.required],
info: ['', Validators.required]
}))
}
我需要有关formArray
反应形式 验证的帮助。我想验证数组中的每个项目,但我不知道该怎么做。谢谢。
html代码:
<label for="name">name:</label>
<input formControlName="name" id="name" type="text">
<div *ngIf="name.invalid && (name.dirty || name.touched)">
<div *ngIf="name.errors.required">
required
</div>
</div>
TypeScript 代码:
createForm() {
this.form = this.fb.group({
person: this.fb.array([this.initItemRows()])
});
}
initItemRows() {
return this.fb.group({
name: [''],
info: ['']
});
}
addNewRow() {
const control = <FormArray>this.form.controls['person'];
control.push(this.initItemRows());
}
deleteRow(index: number) {
const control = <FormArray>this.form.controls['person'];
control.removeAt(index);
}
get name() { return this.form.get('person.name'); }
get info() { return this.form.get('person.info'); }
我试过这个:
initItemRows() {
return this.fb.group({
name: ['', Validators.required ],
info: ['', Validators.required ]
});
}
没用..
你的 name
和 info
的 getter 实际上并不针对特定的表单控件,因为你的 person
是一个 formArray,例如 this.form.get('person.name');
不存在在你的表格中。您需要做的是对每个表单组使用迭代并使用其控件定位该组,因此您的模板应如下所示:
<div *ngFor="let p of form.controls.person.controls; let i = index"
[formGroupName]="i">
<label for="name">name:</label>
<input formControlName="name" id="name" type="text">
<!-- check if the name in this group has the error -->
<div *ngIf="p.controls.name.dirty">
<div *ngIf="p.hasError('required', 'name')">Required</div>
</div>
</div>
另外一个建议是,你可以稍微缩短你的代码并删除一个 initializing/adding formgroup 不需要的方法到你的数组,所以我在这里删除了 addNewRow
, initItemRows
可以在需要添加新行时调用。
this.form = this.fb.group({
person: this.fb.array([])
});
this.initItemRows();
initItemRows() {
let ctrl = <FormArray>this.form.controls.person;
ctrl.push(this.fb.group({
name: ['', Validators.required],
info: ['', Validators.required]
}))
}