Это правильный способ добавить валидаторы к существующим в Custom Form Control? - PullRequest
0 голосов
/ 07 мая 2020

Мне интересно, правильно ли мое решение. В моем приложении я использую реактивную форму и в свой CustomFormControl (который реализует ControlValueAccessor) я добавил валидатор myControl: ["", Validators.required]. Этот валидатор нужен только на нескольких страницах, поэтому его добавляет formBuilder.

Но также мне нужны валидаторы, которые всегда будут использоваться для этого элемента управления. Поэтому, чтобы заставить его работать под моим контролем, мне пришлось добавить токен NG_VALIDATORS, который позволяет мне использовать метод validate(), который, насколько я знаю, срабатывает каждый раз, когда необходимо проверить элемент управления:

@Component({
    selector: "my-control",
    templateUrl: "./my-control.component.html",
    providers: [
        {
            provide: NG_VALUE_ACCESSOR,
            useExisting: MyControlComponent,
            multi: true
        },
        {
            provide: NG_VALIDATORS,
            useExisting: MyControlComponent,
            multi: true
        }
    ]
})
export class MyControlComponent implements OnInit, ControlValueAccessor {

    ...

    validate(value: AbstractControl): void {
        value.setValidators(Validators.compose([value.validator, Validators.min(0), Validators.max(200)]));
    }
}

Обратите внимание, что у меня есть value.validator, потому что я хочу объединить существующие валидаторы (добавленные в конструктор форм) с этими валидаторами min и max. Все работает нормально, но это правильное решение, потому что я не смог найти такой случай в Google.

1 Ответ

1 голос
/ 07 мая 2020

Я нашел лучшее решение, валидаторы можно добавлять прямо в массив провайдеров.

providers: [
    {provide: NG_VALIDATORS, useValue: Validators.min(0), multi: true},
    {provide: NG_VALIDATORS, useValue: Validators.max(200), multi: true},
]
...