Angular 角度抽象控制消除误差
我想要一种从表单控件中删除特定错误而不是清除所有错误的方法Angular 角度抽象控制消除误差,angular,Angular,我想要一种从表单控件中删除特定错误而不是清除所有错误的方法 control.setError({'firstError': true}) 为了消除这个特定的错误,比如 control.removeError({'firstError}) and not control.setError({null}) 我试过了 control.setError({'firstError': false}) 但是没有起作用 任何帮助。谢谢 angular 4.1.1您可以这样删除: control.setE
control.setError({'firstError': true})
为了消除这个特定的错误,比如
control.removeError({'firstError}) and not control.setError({null})
我试过了
control.setError({'firstError': false})
但是没有起作用
任何帮助。谢谢
angular 4.1.1您可以这样删除:
control.setErrors({'firstError': null})
不幸的是,它对我不起作用。我只是用它来重新计算值和验证。 下面是我的验证器函数,它验证我的
grosswight
validateWeights(formGroup) {
let netWeight = formGroup.get('netWeight');
let grossWeight = formGroup.get('grossWeight');
if (parseFloat(netWeight.value) > parseFloat(grossWeight.value)) {
grossWeight.setErrors({ 'customError': true });
netWeight.setErrors({ 'customError': true });
} else {
if(netWeight.errors && netWeight.errors['customError']) {
netWeight.updateValueAndValidity();
}
if (grossWeight.errors && grossWeight.errors['customError']) {
grossWeight.updateValueAndValidity();
}
}
}
首先,您应该检查字段是否有此错误。 接下来,移除它。 最后,您需要更新控制器中的所有错误 在验证器函数中类似于以下内容:
if (control.hasError('firstError')) {
delete control.errors['firstError'];
control.updateValueAndValidity();
}
注意。您可以通过以下方式删除错误:
control.setErrors({'firstError': null});
control.updateValueAndValidity();
如果我们从Angular 8开始动态地添加和删除错误,那么上面的示例根本不起作用。我正在根据其他控件的状态添加错误。i、 e.我定义了两个具有相同电子邮件地址的客户。这是我能找到的唯一有效的解决方案 点击(重复错误=>{ /*未来自我注意。。。 *我开始讨厌抽象控制错误了。 *电子邮件控件可能有多个错误(必填、电子邮件和重复); *清除错误的唯一方法是在传递给setErrors调用的对象中不包含错误。 *您不能传递null或undefined!它仍将作为错误进行计算! *如果根本没有错误,这也是正确的。您不能传递setErrors({}),否则控件将被删除 *无效,即使没有错误!您必须调用setErrors(null); *这很愚蠢,但这是唯一可行的方法。 *此代码与设置/删除重复错误有关。 */ const email=this.form.get('email'); //克隆现有错误 const existingErrors={…email.errors}; //确保删除重复错误(我们在重复错误的更改处理程序中) 删除现有错误。重复; 如果(重复错误){ //我们有一个新的重复错误,请添加它。 setErrors({…existingErrors,duplicate:duplicateError.errorMessage}); }else if(Object.keys(existingErrors).length==0){ //我们没有错误,所以传递null email.setErrors(空); }否则{ //我们有现有错误,但没有新的重复错误。请传递现有错误。 email.setErrors(existingErrors); } this.changeDetector.markForCheck(); })
关于这个问题的其他帖子中已经说明了很多(例如,删除error属性(仍然将控件标记为
无效的),changeholders
(无限循环)中的updateValue和validity()
问题等)。总而言之,我现在使用下面的小函数,它保持其他错误不变,如果没有其他错误保留,则重置无效标志:
removeFormControlError(control: AbstractControl, errorName: string) {
if (control?.errors && control?.errors[errorName]) {
delete control.errors[errorName];
if (Object.keys(control.errors).length === 0) {
control.setErrors(null);
}
}
}
不会再工作了。您需要使用助手方法。抄袭
我就是从这里来的,并尝试了这个小的解决方法我使用的是动态表单,我想从另一个组件中清除一个组件的错误。我尝试了.setErrors()方法,但不起作用。下面列出了我的工作解决方案
clearControlError( control: AbstractControl ): void {
const err = control.errors;
if (err) {
delete err['timeNotValid'];
if (!Object.keys(err).length) {
control.setErrors(null);
} else {
control.setErrors(err);
}
}
}
现在我可以通过将任何AbstractControl类型控件的错误传递给如下函数来清除它
this.clearControlError(this.formBase.parent.get('startTime'));
或
我使用*ngIf显示一些控件导致了这个错误。我想删除所有错误并从头开始这项工作:
Object.keys(this.myForm.controls).forEach(controlName => {
if (controlName != "search") {
let control = that.myForm.controls[controlName];
if (control.errors) {
let errorKeys = Object.keys(control.errors);
errorKeys.forEach(key => {
delete control.errors[key];
})
}
control.setErrors(null);
this.options[controlName + "Error"] = null;
}
});
在我的代码中,我想不使用“search”控件,我还清除了保存在这个.options中的错误字符串。{controlName}error非常感谢。你是一个救生员,我相信这是control.setErrors({'firstError':null})
control.setError({})在起作用。但是,我确实认为它将从控件中删除所有错误,而不仅仅是一个错误。我相信它是control.setErrors(null)可能在某个时间点起作用,但现在不起作用。您无法像这样从控件中删除单个错误。这里是最好的解决方案。感谢您接受它是control.setErrors()
请记住,使用此解决方案,control.invalid仍然为true bc control.errors.length>0选项updateValue和validity()的参数确定控件如何传播更改和发出事件,因此,如果您不想将值发送到valueChanges
订阅者,则必须设置control.updateValueAndValidity({emitteevent:false})
Perfect,特别是因为它只允许消除一个错误,而不重置整个控件验证程序。如果您还没有使用valueChanges
的处理程序,这将非常有用。我正在根据表单值的其他部分来验证控件。因此,updateValueAndValidity
会导致一个无限循环。updateValueAndValidity({onlySelf:true,emitEvent:false})
@jkyoutseyI即将对此提出批评,因为.errors是一个只读属性。当然,这并不能使列表一成不变,所以实际上这是一个很棒的想法!我正要写一些与此效果相同的东西,需要先设置一个setErrors(null),然后是一个循环,以恢复出现的所有错误,但您希望删除的错误除外。但您的解决方案效率更高。如果您解释代码而不仅仅是转储代码,这将是一个更好的答案。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-更明确的是,不可能这个解决方案很好,因为它避免了其他一些答案所存在的control.invalid仍然是真正的bc control.errors.length>0
问题。
this.clearControlError(this.formBase.parent.get('startTime'));
this.clearControlError(this.form.controls['startTime']);
this.form.controls["field"].setErrors(null);
Object.keys(this.myForm.controls).forEach(controlName => {
if (controlName != "search") {
let control = that.myForm.controls[controlName];
if (control.errors) {
let errorKeys = Object.keys(control.errors);
errorKeys.forEach(key => {
delete control.errors[key];
})
}
control.setErrors(null);
this.options[controlName + "Error"] = null;
}
});