Пожалуйста, обратитесь к моему plunkr
Я играл с новым Angular 2 RC и, кажется, понял, как работает проверка формы.
Сначала я создаю 2 объекта с именами defaultValidationMessages и formDefinition.
private defaultValidationMessages: { [id: string]: string };
formDefinition: {
[fieldname: string]:
{
displayName: string,
placeholder: string,
currentErrorMessage: string,
customValidationMessages: { [errorKey: string]: string }
defaultValidators: ValidatorFn,
defaultValue: any
}
};
Затем я загружаю эти объекты с валидаторами по умолчанию и информацией о полях. и создайте ControlGroup из объекта formDefinition.
this.defaultValidationMessages = {
'required': '{displayName} is required',
'minlength': '{displayName} must be at least {minlength} characters',
'maxlength': '{displayName} cannot exceed {maxlength} characters',
'pattern': '{displayName} is not valid'
}
this.formDefinition = {
'name': {
displayName: 'Name',
placeholder: '',
currentErrorMessage: '',
customValidationMessages: {},
defaultValidators: Validators.compose(
[
Validators.required,
Validators.minLength(3),
Validators.maxLength(50)
]),
defaultValue: this.person.name
},
'isEmployee': {
displayName: 'Is Employee',
placeholder: '',
currentErrorMessage: '',
customValidationMessages: {},
defaultValidators: Validators.compose([]),
defaultValue: this.person.isEmployee
},
'employeeId': {
displayName: 'Employee Id',
placeholder: '',
currentErrorMessage: '',
customValidationMessages: { 'pattern': '{displayName} must be 5 numerical digits' },
defaultValidators: Validators.compose(
[
Validators.pattern((/\d{5}/).source)
]),
defaultValue: this.person.employeeId
}
}
this.personForm = this.formBuilder.group({});
for (var v in this.formDefinition) {
this.personForm.addControl(v, new Control(this.formDefinition[v].defaultValue, this.formDefinition[v].defaultValidators));
}
this.personForm.valueChanges
.map(value => {
return value;
})
.subscribe(data => this.onValueChanged(data));
Используя метод, который я изучил на сеансе ng-conf 2016 Деборы Курата, я привязываю метод к событию ControlGroups valueChanges.
Определяя наборы валидаторов по умолчанию для каждого элемента управления, он позволяет элементу управления динамически добавлять к нему новые валидаторы на основе будущих действий. А затем вернуться к валидаторам по умолчанию позже.
Вопрос у меня все еще есть.
У меня возникла проблема с получением intellisense машинописного текста для импорта типа ValidatorFn. Я нашел его здесь, но я не думаю, что должен получить к нему доступ следующим образом:
import { ValidatorFn } from '../../../node_modules/@angular/common/src/forms/directives/validators'
Мне также пришлось сбросить форму, установив некоторые внутренние элементы. Есть ли лучший способ сбросить форму? увидеть ниже:
(<any> this.programForm.controls[v])._touched = false;
(<any> this.programForm.controls[v])._dirty = false;
(<any> this.programForm.controls[v])._pristine = true;
Пожалуйста, посмотрите на мой планк и дайте мне знать, есть ли лучший способ обработки динамической проверки формы, управляемой моделью?