无法读取 angular6 反应形式中未定义的 属性 'touched'
Cannot read property 'touched' of undefined in angular6 reactive forms
我已经编写了代码来验证页面,但是我收到类似“无法读取未定义的 属性 'touched'”的错误。请任何人帮助我这个 code.please 如果任何人纠正我错了。
html:
<div class="container pt-4">
<form [formGroup]="goalForm" (submit)="submit()">
<div class="card">
<div class="card-header">Sub Goals</div>
<div class="card-body" formArrayName="subgoals">
<div *ngFor="let goal of goalForm.controls.subgoals.controls; let i=index">
<div [formGroupName]="i" class="row">
<div class="form-group col-sm-3">
<label for="name">Criteria Name *</label>
<input class="form-control" formControlName="criteria_name" type="text"
id="criteria_name" name="criteria_name"
placeholder="Criteria Name">
<span class="text-danger" *ngIf="goalForm.controls['criteria_name'].touched
&& goalForm.controls['criteria_name'].hasError('required')">
Criteria Name is required! </span>
</div>
<div class="form-group col-sm-3">
<label for="weightage">Criteria Weightage *</label>
<input class="form-control" formControlName="criteria_weightage" type="number"
id="criteria_weightage" name="criteria_weightage"
placeholder="Criteria Weightage">
<span class="text-danger" *ngIf="goalForm.controls['criteria_weightage'].touched
&& goalForm.controls['criteria_weightage'].hasError('required')">
Criteria Weightage is required! </span>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
kpa-goal.component.ts:
ngOnInit(){
this.goalForm = this.fb.group({
subgoals :this.fb.array([
this.initgoal(),
])
});
}
initgoal(){
return this.fb.group({
criteria_name: [null,Validators.compose([Validators.required])],
criteria_weightage: [null,Validators.compose([Validators.required])]
});
}
您实际上在 FormGroup 和 2 个字段(criteria_name & criteria_weightage) 位于 FormArray 中...因此您必须通过遍历子目标来访问这 2 个字段,然后才能到达您的 2 个字段(criteria_name 和 criteria_weightage)。
相关HTML:
<div class="container pt-4">
<form [formGroup]="goalForm" (submit)="submit()">
<div class="card">
<div class="card-header">Sub Goals</div>
<div class="card-body" formArrayName="subgoals">
<div *ngFor="let goal of goalForm.controls.subgoals.controls; let i=index">
<div [formGroupName]="i" class="row">
<div class="form-group col-sm-3">
<label for="name">Criteria Name *</label>
<input class="form-control" formControlName="criteria_name" type="text"
id="criteria_name" name="criteria_name"
placeholder="Criteria Name">
<span class="text-danger" *ngIf="goalForm.controls.subgoals.controls[0].controls.criteria_name.touched && goalForm.controls.subgoals.controls[0].controls.criteria_name.errors?.required" >
Criteria Name is required!
</span>
</div>
<div class="form-group col-sm-3">
<label for="weightage">Criteria Weightage *</label>
<input class="form-control" formControlName="criteria_weightage" type="number"
id="criteria_weightage" name="criteria_weightage"
placeholder="Criteria Weightage">
<span class="text-danger" *ngIf="goalForm.controls.subgoals.controls[0].controls.criteria_weightage.touched && goalForm.controls.subgoals.controls[0].controls.criteria_weightage.errors?.required" >
Criteria Weightage is required!
</span>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
我已经编写了代码来验证页面,但是我收到类似“无法读取未定义的 属性 'touched'”的错误。请任何人帮助我这个 code.please 如果任何人纠正我错了。
html:
<div class="container pt-4">
<form [formGroup]="goalForm" (submit)="submit()">
<div class="card">
<div class="card-header">Sub Goals</div>
<div class="card-body" formArrayName="subgoals">
<div *ngFor="let goal of goalForm.controls.subgoals.controls; let i=index">
<div [formGroupName]="i" class="row">
<div class="form-group col-sm-3">
<label for="name">Criteria Name *</label>
<input class="form-control" formControlName="criteria_name" type="text"
id="criteria_name" name="criteria_name"
placeholder="Criteria Name">
<span class="text-danger" *ngIf="goalForm.controls['criteria_name'].touched
&& goalForm.controls['criteria_name'].hasError('required')">
Criteria Name is required! </span>
</div>
<div class="form-group col-sm-3">
<label for="weightage">Criteria Weightage *</label>
<input class="form-control" formControlName="criteria_weightage" type="number"
id="criteria_weightage" name="criteria_weightage"
placeholder="Criteria Weightage">
<span class="text-danger" *ngIf="goalForm.controls['criteria_weightage'].touched
&& goalForm.controls['criteria_weightage'].hasError('required')">
Criteria Weightage is required! </span>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
kpa-goal.component.ts:
ngOnInit(){
this.goalForm = this.fb.group({
subgoals :this.fb.array([
this.initgoal(),
])
});
}
initgoal(){
return this.fb.group({
criteria_name: [null,Validators.compose([Validators.required])],
criteria_weightage: [null,Validators.compose([Validators.required])]
});
}
您实际上在 FormGroup 和 2 个字段(criteria_name & criteria_weightage) 位于 FormArray 中...因此您必须通过遍历子目标来访问这 2 个字段,然后才能到达您的 2 个字段(criteria_name 和 criteria_weightage)。
相关HTML:
<div class="container pt-4">
<form [formGroup]="goalForm" (submit)="submit()">
<div class="card">
<div class="card-header">Sub Goals</div>
<div class="card-body" formArrayName="subgoals">
<div *ngFor="let goal of goalForm.controls.subgoals.controls; let i=index">
<div [formGroupName]="i" class="row">
<div class="form-group col-sm-3">
<label for="name">Criteria Name *</label>
<input class="form-control" formControlName="criteria_name" type="text"
id="criteria_name" name="criteria_name"
placeholder="Criteria Name">
<span class="text-danger" *ngIf="goalForm.controls.subgoals.controls[0].controls.criteria_name.touched && goalForm.controls.subgoals.controls[0].controls.criteria_name.errors?.required" >
Criteria Name is required!
</span>
</div>
<div class="form-group col-sm-3">
<label for="weightage">Criteria Weightage *</label>
<input class="form-control" formControlName="criteria_weightage" type="number"
id="criteria_weightage" name="criteria_weightage"
placeholder="Criteria Weightage">
<span class="text-danger" *ngIf="goalForm.controls.subgoals.controls[0].controls.criteria_weightage.touched && goalForm.controls.subgoals.controls[0].controls.criteria_weightage.errors?.required" >
Criteria Weightage is required!
</span>
</div>
</div>
</div>
</div>
</div>
</form>
</div>