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;
  }
});