Angular 自定义验证器:为什么要导出函数?

Angular Custom validator: why export function?

我正在 Angular 中做我的第一步,必须为模板表单中的数字字段创建自定义最大验证器。就是这样:

import {Directive, Input} from '@angular/core';
import {AbstractControl, NG_VALIDATORS, ValidationErrors, Validator, ValidatorFn} from '@angular/forms';

@Directive({
  selector: '[appMaximumValue]',
  providers: [{provide: NG_VALIDATORS, useExisting: MaximumValueDirective, multi: true}]
})
export class MaximumValueDirective implements Validator {
  @Input('appMaximumValue') maximumValue: number;

  constructor() {
  }

  validate(control: AbstractControl): ValidationErrors | null {
    return this.maximumValue ? maximumValueValidator(this.maximumValue)(control) : null;
  }
}

export function maximumValueValidator(minimum: number): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } | null => {
    return control.value > minimum ? {'maximumValue': {value: control.value}} : null;
  };
}

想了想发现不带导出功能也可以:

import {Directive, Input} from '@angular/core';
import {AbstractControl, NG_VALIDATORS, ValidationErrors, Validator, ValidatorFn} from '@angular/forms';

@Directive({
  selector: '[appMaximumValue]',
  providers: [{provide: NG_VALIDATORS, useExisting: MaximumValueDirective, multi: true}]
})
export class MaximumValueDirective implements Validator {
  @Input('appMaximumValue') maximumValue: number;

  constructor() {
  }

  validate(control: AbstractControl): ValidationErrors | null {
    return Number(control.value) > this.maximumValue ? {'maximumValue': {value: control.value}} : null;
  }
}

所以我的问题是,这个导出功能的原因是什么?

"export"关键字是当你想在其他classes或函数中使用特定的class或特定函数时所必需的。如果不导出,我们就无法导入那些 classes 或函数。

例如,

export class HomeComponent {}

export function ValidatorFunction {}

在另一个class中,你可以使用

import { HomeComponent } from '/somelocation';

import { ValidatorFunction } from '/somelocation';

但是,当涉及到这个特定场景时,您不需要导入它,因为它是一个 static method.Please 参考下面 link。

如果要在多个地方使用验证器的逻辑,您可能需要导出函数。

此外,在您的情况下,您可以使用 内置 max validator,在 Validators.max

下可用
@Directive({})
export class YourDirective implements Validator {
 @Input() maxValue: number

  ngOnChanges(changes: SimpleChanges): void {
    if ('maxValue' in changes) {
      this.createValidator();
    }
  }

  validate(control: AbstractControl): ValidationErrors | null {
    return this.validator ? this.validator(control) : null;
  }

  private createValidator(): void {
    this.validator = this.maxValue ? Validators.max(this.maxValue) : null;
  }
}

因为你导出了maximumValueValidator,你也可以通过导入函数直接在TS文件中使用验证器逻辑。

该指令只能在 HTML 文件中使用,因此对于您的表单的使用,无需导出即可。

如果你出于某种原因想在你的 TS 文件中使用验证,你可以导出 maximumValueValidator 函数,因为这是你的验证器的真正逻辑。

如果您不打算在 TS 文件中也执行此验证,您可以删除 maximumValueValidator 的导出。

您上面列出的示例基本上为两种不同类型的表单实现了验证器。

如果您要 template-driven forms, while the function below that would be needed is you want to control your form with your .ts-files, meaning you are going for reactive forms.

,使用指令的方法很有用

它们的工作方式不同,使用方式也大不相同。 虽然在一种情况下你会得到类似

HTML:
<input type="number" appMaximumValue="5" />

你会选择

HTML:
<input type="number" formControlName="myControl" />

ts:
form = new FormGroup({
  'myControl': new FormControl(0, maximumValueValidator(5));
});

在反应形式的情况下。

您可以在官方文档中阅读更多相关信息 form validation