将预定义的验证器添加到 Angular 中的自定义组件

Posted

技术标签:

【中文标题】将预定义的验证器添加到 Angular 中的自定义组件【英文标题】:Add predefined validator to a custom component in Angular 【发布时间】:2017-10-10 08:22:02 【问题描述】:

我正在开发一个自定义组件,用于 Angular 中的表单。我正在实现ControlValueAccessor 接口,效果很好。

但是,我的组件没有理由在没有 required 验证器的情况下使用(它是一个 CAPTCHA),因此组件的所有调用都必须指定 required 验证器。

是否有可能以某种方式将此验证器直接嵌入到我的组件中,以便在与ngModel 和表单(基于模板和反应式)一起使用时始终应用到它?


澄清。考虑这个例子:

<my-captcha [(ngModel)]="firstCaptcha" required></my-captcha>

<my-captcha [(ngModel)]="secondCaptcha" required></my-captcha>

<my-captcha [(ngModel)]="thirdCaptcha" required></my-captcha>

上面所有对MyCaptcha 组件的调用都必须使用required 属性才能将所需的验证器应用于表单控件。

是否可以在不明确指定required 属性的情况下调用我的自定义控制器,但仍然应用了验证器?像这样:

<my-captcha [(ngModel)]="captchaValue"></my-captcha>

【问题讨论】:

抱歉,我有点不专心,但是,必需的验证器是什么意思?你的意思是required 属性? 是的,我的意思是必须提供组件的值,否则视为无效。 Angular 在基于模板的表单中使用 required 属性解决了这个问题。 我目前处于类似情况。是否可以选择使用反应形式?到目前为止,我发现的所有可能有帮助的东西都是用响应式表单完成的 我认为解决方案应该在响应式表单和模板表单之间交叉兼容。 【参考方案1】:

组件的所有调用都必须指定必需 验证器

这引发了使用 abstract classextend 的想法。

因此,将required 验证器嵌入到您的所有表单组件的方式可能是这样的:

export abstract class FormValidationClass implements ControlValueAccessor 
     // Implement your validation methods for your standard form including required validator

    protected formModel:<any>;        

    protected constructor() 
    

    public requiredValidatorMethod()  
        // Do stuff here with formModel, for example 
    

而且,您实际创建的组件将有一个表单:

export class UserFilter extends FormValidationClass implements OnInit 

      protected formModel:<any>;

      this.requiredValidatorMethod (this.formModel);

因此,只要您的类声明 protected formModelextends FormValidationClass,您就可以使用 FormValidationClass 中的方法,并且不必每次都为每个具有表单的组件添加特定的逻辑。

这将是我将逻辑嵌入到所有包含表单的组件的方式,在这种情况下,将required 验证器嵌入到包含需要验证的表单的所有组件中。

希望它有所帮助,或者至少有用!让我知道事情的后续!

干杯!

【讨论】:

感谢您花时间写下答案,但是,我认为您误解了我的问题。我已经澄清了一点。我说的不是重用组件来定义另一个组件,而是将验证器添加到组件本身,而不是它的调用。调用是指模板中的单一用法。 对,我想我明白了。看看这个:angular.io/docs/ts/latest/cookbook/… 在代码中进行验证,不需要required 属性(他保留它是为了样式目的) 关于您的链接,他们没有将验证器封装在自定义组件中,他们只是将其从基于模板的表单中的 required 属性移动到反应式表单中的 Validators.required 符号。但他们仍然必须参考它。

以上是关于将预定义的验证器添加到 Angular 中的自定义组件的主要内容,如果未能解决你的问题,请参考以下文章

验证不会传播到 Angular 中的自定义表单控件 ng-select

如何根据 Angular 2 中的自定义验证规则显示错误消息?

Angular - 模板驱动的表单 - 控制器中的自定义验证器功能

Angular4 中的自定义验证

angular 2+ 中的自定义输入类型

Angular 2 / Material - 应用到父 FormGroup 的自定义验证器未显示 md 错误