数字输入表单验证未显示正确的错误消息
Number Input form validation doesn't show the right error message
验证有效,但当输入错误约为 min/max.
时,我总是收到与 required 链接的相同错误消息
另一个问题是,只有在我第一次点击输入框外时才会显示错误消息。
component.ts
import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { FormControl, Validators, FormBuilder, FormGroup} from '@angular/forms';
export class myClass implements OnInit {
myform: FormGroup;
constructor (private _fb:FormBuilder){}
public someAmount = new FormControl('', [Validators.required, Validators.min(10), Validators.max(300)]);
ngOnInit():void {
this.myform = this._fb.group({
someAmount: ['', [Validators.required, Validators.min(10), Validators.max(300)]]
});
}
}
component.html
<form novalidate [formGroup]="myform" class="col-sm-4 form-group">
<md-input-container>
<input mdInput id="amount"
name="someAmount"
formControlName="someAmount"
type="number"
class="form-control "
[(ngModel)]="amount"
placeholder="amount"
(keyup)="onAmountChange()"/>
<md-error *ngIf="someAmount.hasError('required')">
<span> number required </span>
</md-error>
<md-error *ngIf="someAmount.hasError('min')" class="top-margin-medium text-center bold alert-danger">
<span>amount should be not less than 10 </span>
</md-error>
<md-error *ngIf="someAmount.hasError('max')" class="top-margin-medium text-center bold alert-danger">
<span>amount should be not more than 300</span>
</md-error>
</md-input-container>
</form>
我认为上面的代码主要有两个问题。
在您的 html 中,您引用的变量 'useramount' 在您的组件中没有定义(它被定义为 someAmount )。
此外,分配给 someAmount 变量的 formControl 没有链接到表单组,因此没有 errors/changes 与之关联。
您需要调整您的组件代码如下
export class myClass implements OnInit {
myform: FormGroup;
useramount:AbstractControl;
constructor (private _fb:FormBuilder){}
ngOnInit():void {
this.myform = this._fb.group({
someAmount: ['', [Validators.required, Validators.min(40), Validators.max(300)]]
});
this.useramount = this.myform.get('someAmount');
}
}
感谢 JeanPaul 指出 formControl 未链接到 formGroup。
我可以通过在 html:
中执行此操作来使其正常工作
<md-error *ngIf="myform.controls['someAmount'].hasError('required')>
<span> required error message </span>
</md-error>
<md-error *ngIf="myform.controls['someAmount'].hasError('min')>
<span>min error message</span>
</md-error>
<md-error *ngIf="myform.controls['someAmount'].hasError('max')>
<span>max error message</span>
</md-error>
更改验证消息以指向具有以下 *ngIf
的表单控件:
*ngIf="myform.hasError('required', 'someAmount')"
*ngIf="myform.hasError('min', 'someAmount')"
*ngIf="myform.hasError('max', 'someAmount')"
此外...
虽然文档中没有明确说明它们 ngModel
和响应式形式不应该一起使用,但我们可以从 ngModel
指令不包含在 ReactiveFormsModule
, 也许我们不应该一起使用它们:)
所以我建议您删除 ngModel
并且只有表单控件:
<input mdInput formControlName="someAmount"
type="number"
(keyup)="onAmountChange()"/>
嗯,现在你缺少双向绑定?不,我们可以只使用表单控件来处理绑定,而不需要 ngModel
。如果有初始值,可以在构建表单时设置:
someAmount: ['initial value', [....]]
或者如果您收到值 "later",您可以使用 setValue
(或 patchValue
):
this.myform.controls.someAmount.setValue("new value!")
如果您需要访问值...
this.myform.get('someAmount').value
至于验证错误不显示,除非你从输入字段中聚焦,看来它仍然是一个错误? 你可以用 md-hint
代替:
<md-hint *ngIf="myform.hasError('min', 'someAmount')" [ngStyle]="{'color': 'red'}">
<span>amount should be not less than 10 </span>
</md-hint>
验证有效,但当输入错误约为 min/max.
时,我总是收到与 required 链接的相同错误消息另一个问题是,只有在我第一次点击输入框外时才会显示错误消息。
component.ts
import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { FormControl, Validators, FormBuilder, FormGroup} from '@angular/forms';
export class myClass implements OnInit {
myform: FormGroup;
constructor (private _fb:FormBuilder){}
public someAmount = new FormControl('', [Validators.required, Validators.min(10), Validators.max(300)]);
ngOnInit():void {
this.myform = this._fb.group({
someAmount: ['', [Validators.required, Validators.min(10), Validators.max(300)]]
});
}
}
component.html
<form novalidate [formGroup]="myform" class="col-sm-4 form-group">
<md-input-container>
<input mdInput id="amount"
name="someAmount"
formControlName="someAmount"
type="number"
class="form-control "
[(ngModel)]="amount"
placeholder="amount"
(keyup)="onAmountChange()"/>
<md-error *ngIf="someAmount.hasError('required')">
<span> number required </span>
</md-error>
<md-error *ngIf="someAmount.hasError('min')" class="top-margin-medium text-center bold alert-danger">
<span>amount should be not less than 10 </span>
</md-error>
<md-error *ngIf="someAmount.hasError('max')" class="top-margin-medium text-center bold alert-danger">
<span>amount should be not more than 300</span>
</md-error>
</md-input-container>
</form>
我认为上面的代码主要有两个问题。
在您的 html 中,您引用的变量 'useramount' 在您的组件中没有定义(它被定义为 someAmount )。
此外,分配给 someAmount 变量的 formControl 没有链接到表单组,因此没有 errors/changes 与之关联。
您需要调整您的组件代码如下
export class myClass implements OnInit {
myform: FormGroup;
useramount:AbstractControl;
constructor (private _fb:FormBuilder){}
ngOnInit():void {
this.myform = this._fb.group({
someAmount: ['', [Validators.required, Validators.min(40), Validators.max(300)]]
});
this.useramount = this.myform.get('someAmount');
}
}
感谢 JeanPaul 指出 formControl 未链接到 formGroup。
我可以通过在 html:
中执行此操作来使其正常工作 <md-error *ngIf="myform.controls['someAmount'].hasError('required')>
<span> required error message </span>
</md-error>
<md-error *ngIf="myform.controls['someAmount'].hasError('min')>
<span>min error message</span>
</md-error>
<md-error *ngIf="myform.controls['someAmount'].hasError('max')>
<span>max error message</span>
</md-error>
更改验证消息以指向具有以下 *ngIf
的表单控件:
*ngIf="myform.hasError('required', 'someAmount')"
*ngIf="myform.hasError('min', 'someAmount')"
*ngIf="myform.hasError('max', 'someAmount')"
此外...
虽然文档中没有明确说明它们 ngModel
和响应式形式不应该一起使用,但我们可以从 ngModel
指令不包含在 ReactiveFormsModule
, 也许我们不应该一起使用它们:)
所以我建议您删除 ngModel
并且只有表单控件:
<input mdInput formControlName="someAmount"
type="number"
(keyup)="onAmountChange()"/>
嗯,现在你缺少双向绑定?不,我们可以只使用表单控件来处理绑定,而不需要 ngModel
。如果有初始值,可以在构建表单时设置:
someAmount: ['initial value', [....]]
或者如果您收到值 "later",您可以使用 setValue
(或 patchValue
):
this.myform.controls.someAmount.setValue("new value!")
如果您需要访问值...
this.myform.get('someAmount').value
至于验证错误不显示,除非你从输入字段中聚焦,看来它仍然是一个错误? md-hint
代替:
<md-hint *ngIf="myform.hasError('min', 'someAmount')" [ngStyle]="{'color': 'red'}">
<span>amount should be not less than 10 </span>
</md-hint>