Angular 2 - 使用自定义验证程序

时间:2016-12-14 19:55:53

标签: angular

我的表单预先填写了user.email。我希望仅在用户使用原始FormControl以外的值填充user.email字段时才启用编辑按钮。是否可以使用自定义验证器执行此操作?

这是我的验证员:

import { FormControl } from  '@angular/forms';

export class ChangedValidator {
   static isValid(control: FormControl): any {
     let initialValue = (' ' + control.value).slice(1);

     if(initialValue === control.value){
            return {
                "changed": true
            };
        }
      return null;
   }
}

目的是克隆FormControl.value,但我意识到每次在FormControl中更改值时都会实例化此类。

编写无法使用的代码的一种非常黑客的方法是从存储它的数据user.email中获取provider,并使用它来与FormControl.value进行比较。正如您可能猜到的那样,验证器仅适用于User对象的参数,而不适用于任何其他参数。

我想编写一个通用Validator来检查表单的当前值是否与初始化的值不同。

修改

这是使用pristine进行此操作的方法,但它并不完美。

import { FormControl } from  '@angular/forms';

export class ChangedValidator { 
   static isValid(control: FormControl): any {

     if(control.pristine){
            return {
                "unchanged": true
            };
        }
      return null;
   }
}

1 个答案:

答案 0 :(得分:1)

如果您需要检查事物是否已从初始值发生变化,而不仅仅是控件不再是原始状态;如同,它可以返回到它的初始值,你不想要错误,然后你可以实现验证功能,如下所示:

static isValid = (initialValue: any): any => {
  return(control: FormControl) => {
   console.log(control.value);

     if(JSON.stringify(initialValue) !== JSON.stringify(control.value)) {
       return {
              "changed": true
          };
     }
    return null;
  }
}

请注意,这是一个quick and dirty object checkcustom validators with parameters上已经有答案,并且对custom validation as a function factory有一个解释,但对细节有点不了解。

  

forbiddenNamevalidator工厂返回已配置的验证程序   功能。该函数接受Angular控件对象并返回   如果控制值有效或验证错误,则为null   宾语。验证错误对象通常具有其属性   name是验证密钥(' forbiddenName'),其值为   我们可以插入错误的任意值的字典   消息({name})。

这里是playground