【问题标题】:Angular 4 custom form validation not triggeringAngular 4自定义表单验证未触发
【发布时间】:2017-08-12 08:46:07
【问题描述】:

我想创建自定义验证来验证密码是否相同,但问题是自定义验证器未触发。抱歉,我无法分享 plunkr。

//这里是寄存器组件(和导入)

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from "@angular/forms";
import { confirmPass } from '../confirm-password.validator';


register_form: FormGroup;

  constructor(
    private _fb: FormBuilder
  ) {
    this.register_form = this._fb.group({
      'name': ['', Validators.required],
      'surname': ['', Validators.required],
      'email': ['', [Validators.required, Validators.pattern('/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/')]],
      'password': ['', [Validators.required, Validators.minLength(8)]],
      'confirm_password': ['', [Validators.required, confirmPass]],
      'phone': ['', Validators.required],
      'birth_date': ['', Validators.required]
    },)
  }

//验证器函数

import { AbstractControl, ValidatorFn } from "@angular/forms";

export function confirmPass(controller): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } => {
        console.log(controller.root.controls['password']);
        if (controller.value == controller.root.get('password').value) {
            return null;
        }
        return { 'error': { value: controller.value } };
    };
}

【问题讨论】:

  • 还不确定,但有一条建议在验证器检查中使用 === 而不是 ==。与我的最小/最大验证器相比,我也只是做相当于 return { 'confirmPass' : {controller.value} } 并且在主代码中是否需要在 Validators 数组中使用 confirmPass()?
  • 感谢 '===' 的事情,不,正如我从示例中看到的那样,不需要使用“()”。

标签: angular validation typescript angular-forms


【解决方案1】:

您需要将密码和确认密码添加到组中

所以你的功能应该是这样的。

this.register_form = this._fb.group({
  'name': ['', Validators.required],
  'surname': ['', Validators.required],
  'email': ['', [Validators.required, Validators.pattern('/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/')]],
  'password_group':this.formBuilder.group(
  {
    'password': ['', [Validators.required, Validators.minLength(8)]],
    'confirm_password': ['', [Validators.required, confirmPass]]
  },
  {
    validator: this.passwordConfirming
  }),
  'phone': ['', Validators.required],
  'birth_date': ['', Validators.required]
})

密码验证功能

 passwordConfirming(c: AbstractControl): { invalid: boolean } {
   if (c.get('password').value !== c.get('confirm_password').value) {
     return {invalid: true};
   }
 }

另外,您需要将formGroupName 转换为 HTML

例如:

<div class="form-group row" formGroupName="passwords">
 // here your pwd and confirmation pwd input
<div>

【讨论】:

  • 我要试试。但是我的代码有什么问题:D
  • 在任何控件上调用验证函数时以反应形式。只能访问该控件。所以问题是你在confirm_password上调用函数。所以你只得到它的价值而不是密码。这就是为什么不工作。
  • 但是我们不能通过root访问其他控件吗?因为 root 返回我们的表单组。
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 2018-01-19
相关资源
最近更新 更多