角度抽象控件删除错误

pha*_*cic 14 angular

我想要一种方法从表单控件中删除特定的错误,而不是清除所有错误.

control.setError({'firstError': true})
Run Code Online (Sandbox Code Playgroud)

并删除特定的错误,如

control.removeError({'firstError}) and not control.setError({null})
Run Code Online (Sandbox Code Playgroud)

我试过了

control.setError({'firstError': false})
Run Code Online (Sandbox Code Playgroud)

但没有奏效.

任何帮助.谢谢

角4.1.1

小智 18

您可以删除错误:

control.setError({'firstError': null});

control.updateValueAndValidity();
Run Code Online (Sandbox Code Playgroud)

  • 请记住,使用此解决方案,control.invalid 仍然为 true bc control.errors.length > 0 (14认同)
  • 除了它是“control.setErrors()” (5认同)
  • updateValueAndValidity() 的 option 参数确定控件如何传播更改并发出事件,因此如果您不想将值发送给 valueChanges 订阅者,则必须设置 control.updateValueAndValidity({emitEvent: false}) ` (2认同)

Cha*_*oot 10

您可以像这样删除:

control.setError({'firstError': null})
Run Code Online (Sandbox Code Playgroud)

  • 我相信它是`control.setErrors({'firstError':null})` (7认同)
  • 也许它在某个时间点起作用,但现在不起作用。您根本无法像这样从控件中删除单个错误。https://github.com/angular/angular/issues/21564 (7认同)
  • 我相信它是control.setErrors(null) (3认同)
  • 非常感谢。你是救命稻草 (2认同)
  • control.setError({}) 这样做有效。但是,我确实认为它会从控件中删除所有错误,而不仅仅是一个错误。 (2认同)
  • @MikhailRatner 还请注意,您必须添加以下几行,您可以在下面的其他答案之一中找到它们。Angular 似乎希望 `control.errors` 为 null,以便控件被视为有效: `if (Object.keys(control.errors || {}).length === 0) { control.setErrors(无效的); }` (2认同)

Dsc*_*uli 8

Much has already been stated in other posts to this question (e.g. delete the error property (which still leaves the control flagged as invalid), issues with updateValueAndValidity() in changeHandlers (infinite loop) etc). Putting it all together I now use the below small function, which leaves other errors untouched and resets the invalid flag if no other errors remain:

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

首先,您应该检查您的字段是否有此错误。接下来,将其删除。最后,您需要更新控件中的所有错误。

验证器函数中的内容如下:

if (control.hasError('firstError')) {
      delete control.errors['firstError'];
      control.updateValueAndValidity();
    }
Run Code Online (Sandbox Code Playgroud)

问候。

  • 这个解决方案很棒,因为它避免了其他一些答案所存在的“control.invalid still tr​​ue bc control.errors.length > 0”问题。 (2认同)
  • 事实上,到 2021 年,Angular 12 就是最好的解决方案。 (2认同)

小智 5

我来自this github issue并尝试这个小解决方法

使用解构赋值

if ( control.hasError('errorToRemove') ) {
  const { errorToRemove, ...errors } = control.errors;
  control.setErrors(errors);
  control.updateValueAndValidity();
}
Run Code Online (Sandbox Code Playgroud)

您还可以尝试omitpick lodash功能,分别省略或挑选一系列您可以稍后设置到控件的错误。

const errors = pick(control.errors, ['onlyErrorsToKeep']);
control.setErrors(errors);
control.updateValueAndValidity();
Run Code Online (Sandbox Code Playgroud)
const errors = omit(control.errors, ['allErrorsToRemove']);
control.setErrors(errors);
control.updateValueAndValidity();
Run Code Online (Sandbox Code Playgroud)


Aam*_*zad 5

我正在使用动态表单,我想从另一个组件中清除一个组件的错误。我尝试了.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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以通过将任何 AbstractControl 类型控件传递给这样的函数来清除它的错误。

this.clearControlError(this.formBase.parent.get('startTime'));
Run Code Online (Sandbox Code Playgroud)

或者

this.clearControlError(this.form.controls['startTime']);
Run Code Online (Sandbox Code Playgroud)