#angular #angular-directive
#angular #angular-директива
Вопрос:
У меня есть следующая директива атрибута для выполнения проверки формы. Мой @NgModule
включает его в свой массив объявлений. Моя форма находится в шаблоне компонента. Как мне добавить appCarrierFormValidation
атрибут в свою форму, чтобы иметь возможность использовать эту директиву и проверять входные данные?
import { Directive } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
@Directive({
selector: '[appCarrierFormValidation]'
})
export class CarrierFormValidationDirective {
addCarrierForm: FormGroup;
constructor(private fb: FormBuilder) {
this.createForm();
}
createForm() {
this.addCarrierForm = this.fb.group({
name: ['', Validators.required],
email: ['', [Validators.required, Validators.email]]
})
}
}
Комментарии:
1. Могу ли я увидеть ваш код в пользовательском валидаторе для
appCarrierFormValidation
?2. Я в замешательстве,
appCarrierFormValidation
правильно ли использовать только селектор атрибутов в шаблоне?3. Извините, я пропустил несколько слов, прежде чем редактировать его. В любом случае, я только что неправильно понял ваш вопрос. Подождите, чего именно вы пытаетесь достичь? Где и когда вы хотели бы, чтобы эти 2 FormControls были проверены? Т.е. Вы бы хотели, чтобы поля формы проверялись немедленно, когда пользователь вводит значение? Или при отправке формы?
4. У меня есть компонент,
AddCarriersComponent
шаблон которого содержит форму,form [formGroup]="addCarrierForm"
эта форма содержит те 2 элемента управления, которые требуют проверки.5. почему вы используете директиву, которая не является компонентом??????
Ответ №1:
Вы можете реализовать это так, я использовал в своем проекте.
import { FormControl } from '@angular/forms';
export function appCarrierFormValidation(control: FormControl) {
// change your logic to validate carrier
let pattern = /[*\/|":?><]/gi;
//if validation fails, return error name amp; value of true
if (pattern.test(control.value)) {
return { validString: true };
}
//otherwise, if the validation passes, we simply return null
return null;
}
И использовать
name: ['', [Validators.required, appCarrierFormValidation]],
Если вы хотите использовать FormGroup
public appCarrierFormValidation() : ValidatorFn{
return (group: FormGroup): ValidationErrors => {
const name= group.controls['name'];
const email= group.controls['email'];
// add your logic here
if (name.value.length < 6 amp;amp; email.value.indexOf('@') < 0) {
email.setErrors({invalid: true});
} else {
email.setErrors(null);
}
return;
};
}
Обновите свой код
createForm() {
this.addCarrierForm = this.fb.group({
name: ['', Validators.required],
email: ['', [Validators.required, Validators.email]]
})
this.addCarrierForm .setValidators(this.appCarrierFormValidation())
}
Комментарии:
1. Какое регулярное выражение шаблона вы используете? И в этом методе мне не нужно было бы добавлять атрибут в шаблон?
2. Это пример, который вы можете изменить на свою логику
3. Я получаю
formGroup expects a FormGroup instance
сообщение об ошибке в моем шаблоне