Наилучший подход для пользовательских валидаторов Angular 2

#angular #angular2-forms #angular2-services

#angular #angular2-forms #angular2-сервисы

Вопрос:

Может кто-нибудь подсказать, какой наилучший подход к организации пользовательских валидаторов, которые используются в различных функциях приложения Angular 2 (для форм, управляемых моделью):

  • Определите их как простые функции проверки
  • Класс со статическими методами для каждого типа валидатора, а затем импортировать и использовать его в разных компонентах.
  • Определите сервис с разными методами для каждого валидатора, а затем добавьте его в провайдеры AppModule и используйте в разных функциях приложения?

Или любой другой подход?

Ответ №1:

Вы можете создать директиву для пользовательского валидатора в формах, управляемых моделью, например,

     import { Directive, forwardRef, Attribute } from '@angular/core';
import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms';

@Directive({
    selector: '[validateEqual][formControlName],[validateEqual][formControl],[validateEqual][ngModel]',
    providers: [
        { provide: NG_VALIDATORS, useExisting: forwardRef(() => EqualValidator), multi: true }
    ]
})
export class EqualValidator implements Validator {
    constructor( @Attribute('validateEqual') public validateEqual: string,
        @Attribute('reverse') public reverse: string) {

    }

    private get isReverse() {
        if (!this.reverse) return false;
        return this.reverse === 'true' ? true: false;
    }

    validate(c: AbstractControl): { [key: string]: any } {
        // self value
        let v = c.value;

        // control vlaue
        let e = c.root.get(this.validateEqual);

        // value not equal
        if (e amp;amp; v !== e.value amp;amp; !this.isReverse) {
          return {
            validateEqual: false
          }
        }

        // value equal and reverse
        if (e amp;amp; v === e.value amp;amp; this.isReverse) {
            delete e.errors['validateEqual'];
            if (!Object.keys(e.errors).length) e.setErrors(null);
        }

        // value not equal and reverse
        if (e amp;amp; v !== e.value amp;amp; this.isReverse) {
            e.setErrors({
                validateEqual: false
            })
        }

        return null;
    }
}