如何在角度中验证特定的
ngModels
例如:我有一个表,我想在其中只验证ngModels
的第二行
我可以使用验证完整表单(所有ngModels
(this.myForm.valid
并且为了验证特定的ngModels
,我可以循环通过this.myForm.controls
并验证特定的一个。
有没有其他方法可以验证而不是在整个表单控件中循环?
下面的完整示例
TS
@ViewChild(NgForm, { static: false }) myForm: NgForm;
employeesData = [{id:"1",firstName:"Tom",lastName:"Cruise",photo:"https://pbs.twimg.com/profile_images/735509975649378305/B81JwLT7.jpg"},{id:"2",firstName:"Maria",lastName:null,photo:"https://pbs.twimg.com/profile_images/3424509849/bfa1b9121afc39d1dcdb53cfc423bf12.jpeg"},{id:"3",firstName:"James",lastName:null,photo:"https://pbs.twimg.com/profile_images/664886718559076352/M00cOLrh.jpg"}];
save() {
//This helps to validate all fields
console.log(this.myForm.valid);
//This contains all form keys - so I can loop through each and validate
console.log(this.myForm.controls);
}
}
HTML
<form #myForm="ngForm">
<table>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Actions</th>
</tr>
<tr *ngFor="let employee of employeesData; let i=index">
<td>
<input type="text" [(ngModel)]="employee.firstName" [name]="'firstName'+i" required>
</td>
<td>
<input type="text" [(ngModel)]="employee.lastName" [name]="'lastName'+i" required>
</td>
<td>
<button (click)="save()">Save</button>
</td>
</tr>
</table>
</form>
有没有更好的方法来验证特定的ngModel?
如何仅验证一行?
我的问题是-检查表的特定行中的所有input
是否有效,而不是像我们对整个表所做的那样循环,只需通过tableForm.valid
。
因此,解决方案是为每个表行设置表单标记
等待。。。table
中不允许使用<form>
标记,它将破坏表格布局
但是我们可以在tr上使用
ngForm
指令,并且可以验证特定的tr的ngModels
完整示例
HTML
<table>
<tr>
<th *ngFor="let header of displayedColumns">{{header}}</th>
<th>Actions</th>
</tr>
<tr ngForm #sampleForm="ngForm" *ngFor="let ds of dataSource; let i=index">
<td>
<input type="text" [(ngModel)]="ds.position" [name]="'position'+i" required>
</td>
<td>
<input type="text" [(ngModel)]="ds.name" [name]="'name'+i" required>
</td>
<td>
<input type="text" [(ngModel)]="ds.symbol" [name]="'symbol'+i" required>
</td>
<td>
<input type="text" [(ngModel)]="ds.weight" [name]="'weight'+i" required>
</td>
<td>
<button (click)="cnsl(sampleForm)">Cnsl</button>
</td>
</tr>
</table>
TS
cnsl(frm: NgForm) {
console.log(frm.controls);
}
在您的示例中,您正在迭代for循环中的表单字段。所以检查表格是否有效是不好的。相反,您可以在索引的帮助下检查这些字段值。
检查此项:
HTML:
<hello name="{{ name }}"></hello>
<form #myForm="ngForm">
<table>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Actions</th>
</tr>
<tr *ngFor="let employee of employeesData; let i=index">
<td>
<input type="text" [(ngModel)]="employee.firstName" [name]="'firstName'+i" required>
</td>
<td>
<input type="text" [(ngModel)]="employee.lastName" [name]="'lastName'+i" required>
</td>
<td>
<button (click)="save(i)">Save</button>
</td>
</tr>
</table>
</form>
TS:
save(i) {
// console.log(this.employeesData[i])
// if (!this.myForm.valid) {
// alert('Please enter details');
// } else {
// alert('Saved');
// }
if(this.employeesData[i].firstName && this.employeesData[i].lastName) {
alert('Saved');
}
else {
alert('Please enter details');
}
}
否则,您可以将Angular Reactive Form与FormArray一起用于动态字段。
我想你正在寻找这个:
this.ngForm.controls['firstname'].(multiple methods) -> // all different methods associated with this.