创建类的正确方法以将所有自定义验证保存在angular 4中

时间:2018-08-23 15:29:46

标签: angular angular-reactive-forms angular4-forms custom-validators

我创建了一个类,其中包含我的应用程序的所有自定义验证。只是想知道这是否是正确的方法。我在网上看到了一些示例,并想到了这段代码。每个方法都必须是静态的吗?如果删除静态键工作,则会出现编译错误。

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

export class FormValidator {

     static validategreater(maxVal, minVal): ValidatorFn {
    return (control: FormControl) => {
      if (control.dirty) {

          if (enteredValue > maxVal) {
            returnObj['greaterError'] = true;
          }
       if (Object.keys(returnObj).length > 0) {
          return returnObj;
        }
      }
      return null;
    };
  }

}

2 个答案:

答案 0 :(得分:1)

对于如何存储自定义验证器,没有任何标准,只需要将其实现ValidatorFn合同的功能。但是建议您遵循angular-forms'标准,因为开发人员已经习惯了它,因此它使您的代码更易于理解。

您可以使用静态成员(如您建议的那样)存储在类上:

class MyCustomValidators {
    // it has to be called like MyCustomValidators.withParams(123, 456)
    static withParams(param1, param2) : ValidatorFn {
       return (control: FormControl) => { /*implementation*/ }
    }

    // it has to be called like MyCustomValidators.withoutParams1
    static withoutParams1(control: FormControl) {
       /*implementation*/
    }

    // it has to be called like MyCustomValidators.withoutParams2()
    static withoutParams2() : ValidatorFn {
       return (control: FormControl) => { /*implementation*/ }
    }
}

或仅functions

export const MyCustomValidator = (control: FormControl) => { /*implementation*/ }

export const MyCustomValidator2 = (param1) => (control: FormControl) => {
    /*implementation*/
}

如您所见,重要的部分是(control: FormControl) => { /*implementation*/ }函数;因此,只要打字稿允许,您就可以用多种方式存储ValidatorFn

此外,在某些情况下,最好根据验证者的上下文来组织验证者,例如CommonValidatorsCustomerValidatorsProductValidators等。这有助于您保持验证者的身份。聚合验证器类的职责更加明确,也不要将更具体的验证器与通用验证器混合使用,例如,使代码维护更加容易。

最后,您可以选择要存储自定义验证的任何标准。虽然,将类与静态方法一起使用会更好,因为它保持与angular-forms相同的标准,因此使用验证器会更加直观,因为它是众所周知的标准。

  

如果删除静态键工作,则会出现编译错误。

如果删除静态对象,则必须创建该类的实例才能访问验证器成员。

new FormValidator().validategreater(1,2)

答案 1 :(得分:0)

我们也走了同样的路。 角度小组也以类似的方式进行。 在这里查看他们的代码: https://github.com/angular/angular/blob/master/packages/forms/src/validators.ts