- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 FormControls 在 Angular2 中进行日期验证。我有一个开始和结束日期。我需要验证开始日期是否在结束日期之前。以下是当控件的值发生变化时我如何编辑控件上的验证器:
this.editForm.get('startDate').valueChanges.debounceTime(100).subscribe(
(startDate: any) => {
if (startDate != null) {
this.editForm.get('startDate').setValidators([FormValidators.validateDate, FormValidators.validateStartAndCompletionDate(this.editForm.get('startDate'), this.editForm.get('completionDate'))]);
this.editForm.get('completionDate').updateValueAndValidity();
} else {
this.editForm.get('startDate').clearValidators();
}
this.editForm.get('startDate').updateValueAndValidity();
}
)
和
this.editForm.get('completionDate').valueChanges.debounceTime(100).subscribe(
(completionDate: any) => {
if (completionDate != null) {
this.editForm.get('completionDate').setValidators([FormValidators.validateDate, FormValidators.validateStartAndCompletionDate(this.editForm.get('startDate'), this.editForm.get('completionDate'))]);
this.editForm.get('startDate').updateValueAndValidity();
} else {
this.editForm.get('completionDate').clearValidators();
}
this.editForm.get('completionDate').updateValueAndValidity();
}
)
这是在开始和结束日期控件上设置错误的验证器:
static validateStartAndCompletionDate(start: any, completion: any) {
return (f: FormControl) => {
if (start.value != null && completion.value != null) {
var startDate = new Date(start.value.date.year, start.value.date.month - 1, start.value.date.day);
var completionDate = new Date(completion.value.date.year, completion.value.date.month - 1, completion.value.date.day);
if (startDate.getTime() > completionDate.getTime()) {
start.setErrors({
"invalidStartAndCompletion": true
});
completion.setErrors({
"invalidStartAndCompletion": true
});
return { invalidStartAndCompletion: true };
} else {
start.setErrors({
"invalidStartAndCompletion": null
});
completion.setErrors({
"invalidStartAndCompletion": null
});
return null;
}
}
}
}
验证器工作正常并且准确地设置了每个 FormControl 元素的错误。当我必须在更新错误后更新每个 FormControl 的有效性时,问题就来了。出于某种原因,使用上面的代码,只有值被更改的元素才会更新其有效性。
例如,如果当前开始日期晚于完成日期(导致验证器错误),并且我更正开始日期使其早于完成日期,则开始日期 FormControl 的有效性从 false 变为 true,但完成日期 FormControl 的有效性保持为假。反之亦然,更正完成日期以修复错误只会使完成日期 FormControl 有效,而不是开始日期 FormControl。
最佳答案
我会走 Deborah 建议的路线。将这些日期放在一个单独的表单组中并对该组进行验证,而不是同时订阅开始日期和完成日期,所以像这样:
this.editForm = this.fb.group({
dates: this.fb.group({
startDate: [new Date(), Validators.required],
completionDate: [new Date(), Validators.required],
},{validator: this.validateMyDates})
});
现在验证在 dates
进行,这也是在模板中显示验证错误时验证错误所在的位置。
然后验证器看起来像这样:
validateMyDates(formgroup: FormGroup) { // parameter is the 'dates' formgroup
let start = formgroup.get('startDate');
let completion = formgroup.get('completionDate')
if (completion < start){
return { invalidStartAndCompletion: true };
}
return null;
}
至于错误消息,您可以通过以下方式找到它:
editForm.hasError('invalidStartAndCompletion', 'dates')
关于javascript - 多个 FormControl 元素的 Angular2 updateValueAndValidity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45443563/
如果输入值是整数,我有一个附加小数点的指令。下面是实现。 import { Directive, ElementRef, Input, OnInit, HostListener, forwardRef
These docs说明如下: If emitEvent is true, this change will cause a valueChanges event on the FormControl
在我的 Angular 4 应用程序中,我有一个包含多个控件的表单。 在某些时候我需要强制更新它们的有效性,所以我在做: this.form.get('control1').updateValueAn
我试图根据某些条件在formGroup控件中添加和删除验证器。 当我通过formGroup.updateValueAndValidity()更新验证程序以使其整体不更新时,好像我正在为每个控件(即fo
我正在尝试使用 FormControls 在 Angular2 中进行日期验证。我有一个开始和结束日期。我需要验证开始日期是否在结束日期之前。以下是当控件的值发生变化时我如何编辑控件上的验证器: th
我升级到 rc.4 并尝试使用新的 forms-api。这是我得到的: “类型错误:this.form.updateValueAndValidity 不是函数” 异常起源于 Angular 内的“fo
我是一名优秀的程序员,十分优秀!