【问题标题】:Reactive forms validating at least one field响应式表单验证至少一个字段
【发布时间】:2018-03-15 04:47:25
【问题描述】:

寻找一种在 Angular 中使用反应式表单来验证 2 个必填字段和其他 10 个字段中的至少一个的方法。因此,我们需要字段 1 和 2,并且必须选择 3 到 12 中的至少一个。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 如果您能发布一些代码,将会对我们有很大帮助。到目前为止,您尝试过什么?

标签: angular angular-reactive-forms


【解决方案1】:

您可以将 3-12 放入一个表单组并针对该表单组编写一个自定义验证器。

这是我编写的自定义验证器示例,用于比较表单组中的“电子邮件”和“确认电子邮件”元素:

function emailMatcher(c: AbstractControl): {[key: string]: boolean} | null {
    let emailControl = c.get('email');
    let confirmControl = c.get('confirmEmail');

    if (emailControl.pristine || confirmControl.pristine) {
      return null;
    }

    if (emailControl.value === confirmControl.value) {
        return null;
    }
    return { 'match': true };
 }

然后将表单定义如下:

    this.customerForm = this.fb.group({
        firstName: ['', [Validators.required, Validators.minLength(3)]],
        lastName: ['', [Validators.required, Validators.maxLength(50)]],
        emailGroup: this.fb.group({
            email: ['', [Validators.required, Validators.pattern('[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+')]],
            confirmEmail: ['', Validators.required],
        }, {validator: emailMatcher}),
        phone: ''
    });

您可以执行类似的操作,将元素 3 - 12 放入表单组,然后编写分配给该组的自定义验证器。

【讨论】:

  • 你会像 html 中的标志一样处理 match: true 吗?
  • 感谢经过一些测试,我发现将返回值作为错误消息进行检查。对于嵌套表单,它的 parentform.controls['childform'].haserror('expectedvalue')
  • 或者你可以使用.get(),就像我在上面的 emailMatcher 函数中展示的那样。
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 2017-02-07
  • 2014-06-17
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多