需要有关角度6反应形式验证的信息,我已经从官方角度网站上进行了研究
我要验证表单并显示不同的错误消息以显示不同的错误
组件代码
this.pinForm = new FormGroup({
'defaultPin': new FormControl(this.pin.oldPin, [
Validators.required,
Validators.minLength(4)
])
});
HTML代码
<form [formGroup]="pinForm" #formDir="ngForm">
<div class="form-group">
<label for="defaultPin">Default Pin</label>
{{formDir.valid}}
<input type="text" name="defaultPin" class="form-control" id ="defaultPin" aria-describedby="defaultPin" placeholder="Please enter your old Pin"
formControlName = "defaultPin" />
<small id="defaultPin" class="form-text text-muted">Check your Email address for default pin.</small>
{{defaultPin}}
<div *ngIf="defaultPin.invalid && (defaultPin.dirty || defaultPin.touched)"
class="alert alert-danger">
enter code here
<div *ngIf="defaultPin.errors.required">
Name is required.
</div>
<div *ngIf="defaultPin.errors.minlength">
Name must be at least 4 characters long.
</div>
</div>
</div>
但是当我运行时,我得到了这个错误
ERROR TypeError: Cannot read property 'invalid' of undefined
at Object.eval [as updateDirectives] (AddPinComponent.html:21)
at Object.debugUpdateDirectives [as updateDirectives] (core.js:10756)
at checkAndUpdateView (core.js:10153)
at callViewAction (core.js:10394)
at execComponentViewsAction (core.js:10336)
at checkAndUpdateView (core.js:10159)
at callViewAction (core.js:10394)
at execEmbeddedViewsAction (core.js:10357)
at checkAndUpdateView (core.js:10154)
at callViewAction (core.js:10394)
请帮助我
答案 0 :(得分:1)
您正在同时使用reactive form
和Template-driven
。
仅使用Reactive form.
在文件中进行更改。 (根据您的要求进行修改)。
Component.Html
<form [formGroup]="pinForm">
<div class="form-group">
<label for="defaultPin">Default Pin</label>
<input type="text" name="defaultPin" class="form-control" id="defaultPin" aria-describedby="defaultPin" placeholder="Please enter your old Pin"
formControlName="defaultPin" />
<span class="text-danger" *ngIf="pinForm.controls['defaultPin'].hasError('required') && (pinForm.controls['defaultPin'].dirty || pinForm.controls['defaultPin'].touched)">This field is required</span>
</div>
</form>
Component.ts
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
export class AppComponent {
pinForm: FormGroup;
constructor(fb: FormBuilder) {
this.pinForm = fb.group({
'defaultPin': [null, Validators.required],
});
}
}
module.ts
// Import ReactiveFormModule in your module.ts file
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [ FormsModule, ReactiveFormsModule ],
如果仍有问题,请参考Stackblitz
答案 1 :(得分:0)
在编写formControlName = "defaultPin"
时,您会为FormControl
提供名称,但是要访问invalid
,errors
等属性,您必须从FormControl
实例FormGroup
喜欢:
pinForm.get('defaultPin')
因此只需将以下吸气剂添加到您的组件中即可:
get defaultPin() {
return this.pinForm.get('defaultPin')
}
答案 2 :(得分:0)
您需要引用pinForm
来获得其控制者:
*ngIf="!pinForm.controls.defaultPin.valid && (pinForm.controls.defaultPin.dirty || pinForm.controls.defaultPin.touched)"
所以,这就是您的表格的样子:
<form [formGroup]="pinForm" #formDir="ngForm">
<div class="form-group">
<label for="defaultPin">Default Pin</label>
{{formDir.valid}}
<input type="text" name="defaultPin" class="form-control" id ="defaultPin" aria-describedby="defaultPin" placeholder="Please enter your old Pin"
formControlName = "defaultPin" />
<small id="defaultPin" class="form-text text-muted">Check your Email address for default pin.</small>
{{defaultPin}}
<div *ngIf="!pinForm.controls.defaultPin.valid && (pinForm.controls.defaultPin.dirty || pinForm.controls.defaultPin.touched)")"
class="alert alert-danger">
enter code here
<div *ngIf="pinForm.controls.defaultPin.errors.required">
Name is required.
</div>
<div *ngIf="pinForm.controls.defaultPin.errors.minlength">
Name must be at least 4 characters long.
</div>
</div>
</div>
此外,您还应该在组件formGroup
中启动ngOnInit()
: