Можно ли создать валидатор, который может использовать несколько значений, чтобы определять, действительно ли мое поле?
например, если клиент предпочитает связаться с клиентом по электронной почте, то поле электронной почты должно быть обязательным.
Спасибо.
Обновлено с помощью примера кода ...
import {Component, View} from 'angular2/angular2';
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
@Component({
selector: 'customer-basic',
viewInjector: [FormBuilder]
})
@View({
templateUrl: 'app/components/customerBasic/customerBasic.html',
directives: [formDirectives]
})
export class CustomerBasic {
customerForm: ControlGroup;
constructor(builder: FormBuilder) {
this.customerForm = builder.group({
firstname: [''],
lastname: [''],
validateZip: ['yes'],
zipcode: ['', this.zipCodeValidator]
// I only want to validate using the function below if the validateZip control is set to 'yes'
});
}
zipCodeValidator(control) {
if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
return { invalidZipCode: true };
}
}
}
equal
иequalTo
методах и хорошей документации!Ответы:
Чтобы напомнить о методах, которые были опубликованы другими, я создавал
FormGroup
валидаторы таким образом, чтобы не задействовать несколько групп.Для этого примера, просто обеспечивают ключевые имена
password
иconfirmPassword
полей.Чтобы
Validators
получить параметры, они должны вернуть afunction
либо с a,FormGroup
либоFormControl
в качестве параметра. В этом случае я проверяюFormGroup
.Технически я мог бы проверить любые два значения, если бы знал их ключи, но я предпочитаю называть свое так
Validators
же, как ошибку, которую они вернут. Функцию можно изменить, чтобы она принимала третий параметр, который представляет ключевое имя возвращаемой ошибки.Обновлено 6 декабря 2016 г. (v2.2.4)
Полный пример: https://embed.plnkr.co/ukwCXm/
источник
FormGroup
для проверки нескольких полей вместо того, чтобы помещать ихValidator
на все.[{validator: matchingPasswords('password', 'confirmPassword')},{validator: matchingEmail('email', 'confirmemail')}]
Я пробовал это, но это не работает. Какие-либо предложения ? @DaveОтвет Дэйва был очень и очень полезным. Однако небольшая модификация может помочь некоторым людям.
В случае, если вам нужно добавить ошибки в
Control
поля, вы можете сохранить фактическое построение формы и валидаторов:Вместо того, чтобы устанавливать ошибку в поле
ControlGroup
, сделайте это в фактическом поле следующим образом:источник
passwordConfirmationInput.setErrors(passwordConfirmationInput.validator(passwordConfirmationInput))
вelse
ветке, чтобы он обновлялся правильно, когда изменениеpasswordInput
делает данные действительными.TypeError: passwordConfirmationInput.validator is not a function
. Это потому, что я явно не создавал FormControl с Validators.required. Я оставил валидаторы пустыми и вместо этого использовал атрибут «required» на входе.{[key: string]: any}
, которыйsetErrors(...)
не возвращает (больше?). ТакжеsetErrors(...)
перезаписывает любые ошибки, которые уже присутствуют, поэтому я добавил к текущему объекту ошибки, например:let errors = formGroup.controls[passwordConfirmationKey].errors;
иif(!errors) errors={};
иerrors['notEquivalent'] = true;
иformGroup.controls[dateControlFirst].setErrors(errors);
При реализации валидаторов для нескольких полей формы вам нужно будет убедиться, что валидаторы повторно оцениваются при обновлении каждого элемента управления формы. Большинство примеров не предоставляют решения для такого сценария, но это очень важно для согласованности данных и правильного поведения.
См. Мою реализацию настраиваемого валидатора для Angular 2, которая учитывает это: https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30 .
Я использую
otherControl.valueChanges.subscribe()
для прослушивания изменений в другом элементе управления иthisControl.updateValueAndValidity()
для запуска еще одного раунда проверки при изменении другого элемента управления.Я копирую приведенный ниже код для использования в будущем:
матч-другой-validator.ts
использование
Вот как вы можете использовать его с реактивными формами:
Более современные валидаторы можно найти здесь: moebius-mlm / ng-validators .
источник
this
для? На самом деле, хорошо иметь именованную функцию для целей отладки.othercontrol.valuechanges.subscribe
нигде не отписался.valueChanges
наблюдаемого, когдаotherControl
он будет уничтожен, что приведет к прекращению подписки. Однако ваши опасения могут быть обоснованными. Я бы посоветовал тщательно отладить этот код в последней версии Angular, используя различные тестовые примеры. Пожалуйста, сообщите, если вы обнаружите какие-либо проблемы.Я использую Angular 2 RC.5, но не могу найти ControlGroup, основываясь на полезном ответе Дейва. Я обнаружил, что вместо этого работает FormGroup. Так что я немного обновил коды Дэйва и решил поделиться с другими.
В файле компонента добавьте импорт для FormGroup:
Определите свои входы на случай, если вам нужен прямой доступ к элементу управления формой:
В конструкторе создайте экземпляр своей формы:
Добавьте в свой класс функцию matchPasswords:
Надеюсь, это поможет тем, кто использует RC.5. Обратите внимание, что я еще не тестировал RC.6.
источник
if (passwordInput.value !== passwordConfirmationInput.value) { return passwordConfirmationInput.setErrors({ notEquivalent: true }); } else { return passwordConfirmationInput.setErrors(null); }
Много копался в угловом источнике, но я нашел способ получше.
HTML-часть для группы паролей
источник
Чтобы расширить ответ Мэтьюданиэля, поскольку это не совсем правильно. Вот пример кода, который показывает, как правильно назначить валидатор для
ControlGroup
.Вот рабочий пример: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
источник
ControlGroup
удален в пользуFormGroup
для всех, кто смотрит на это. Документы и изучение Пример Angular2Вот еще один вариант, который мне удалось придумать, не зависящий от целого или вспомогательного
ControlGroup
а напрямую привязан к каждомуControl
.Проблема, с которой я столкнулся, заключалась в том, что элементы управления, которые зависели друг от друга, не были иерархически вместе, поэтому я не смог создать
ControlGroup
. Кроме того, мой CSS был настроен так, что каждый элемент управления будет использовать существующие классы angular, чтобы определить, отображать ли стиль ошибки, что было более сложным при работе с групповой проверкой, а не с проверкой конкретного элемента управления. Попытка определить, был ли действителен отдельный элемент управления, была невозможна, поскольку проверка была привязана к группе элементов управления, а не к каждому отдельному элементу управления.В моем случае я хотел, чтобы значение поля выбора определяло, требуется ли другое поле или нет.
Это создается с помощью конструктора форм в компоненте. Для модели выбора вместо того, чтобы напрямую связывать ее со значением объекта запроса, я связал ее с функциями получения / установки, которые позволят мне обрабатывать события «при изменении» для элемента управления. Затем я смогу вручную установить проверку для другого элемента управления в зависимости от нового значения элемента управления select.
Вот соответствующая часть просмотра:
Соответствующая составная часть:
В моем случае у меня всегда была проверка шаблона, привязанная к элементу управления, поэтому
validator
всегда установлено что-то, но я думаю, вы можете установитьvalidator
значение null, если у вас нет проверки, привязанной к элементу управления.ОБНОВЛЕНИЕ. Существуют и другие методы регистрации изменений модели, например
(ngModelChange)=changeFunctionName($event)
подписка на изменения контрольных значений с помощьюthis.form.controls["employee"].valueChanges.subscribe(data => ...))
источник
Я попробовал большинство из этих ответов, но ни один из них не помог мне. Я нашел здесь рабочий пример https://scotch.io/@ibrahimalsurkhi/match-password-validation-with-angular-2
источник
equalTo
Искал это тоже и в итоге использовал из пакета ng2-validation ( https://www.npmjs.com/package/ng2-validation )Вот пример: На основе шаблона:
Модель с приводом:
Шаблон:
источник
Вот моя версия, которую я использовал для обеспечения того, чтобы возраст в одном поле был больше или равен возрасту в другом поле. Я также использую группы форм, поэтому я использую
group.get
функцию, а неgroup.controls[]
И в компоненте:
источник
Я думаю, что сейчас лучше всего создать группу форм для хранения элементов управления. Когда вы создаете экземпляр своего Control, передайте функцию для его проверки. пример:
Я знаю, что это сильно зависит от версии angularjs2, которую вы используете. Это было протестировано против 2.0.0-alpha.46
Если у кого-то есть предложение получше, например, написать собственный валидатор (что может быть лучшим способом), мы приветствуем его.
РЕДАКТИРОВАТЬ
вы также можете использовать ControlGroup и полностью проверить эту группу.
Просто отредактируйте сообщения в соответствии с вашим доменом.
источник
Ответ Луи Круза мне очень помог.
Для завершения просто добавьте в else сброс setErrors: return passwordConfirmationInput.setErrors (null);
И все отлично работает!
Спасибо вам,
С Уважением,
TGA
источник
Angular 8 Пример проверки в поле подтверждения пароля
К вашему сведению: это не обновит проверку в поле passwordConfirm, если основное поле «пароль» будет изменено после того, как эта проверка прошла. Но вы можете аннулировать поле подтверждения пароля, когда пользователь вводит в поле пароля
register.component.ts
пароль-confirm-validator.ts
register.component.html
источник
Я бы предложил использовать библиотеку
ng-form-rules
. Это отличная библиотека для создания всевозможных форм с логикой проверки, отделенной от компонента и которая может зависеть от изменений значений в других областях формы. У них есть отличная документация , примеры и видео, демонстрирующие его функциональность. . Выполняя такую проверку, то, что вы пытаетесь сделать, тривиально.Вы можете ознакомиться с их README, чтобы получить некоторую высокоуровневую информацию и базовый пример.
источник
Пароль Angular 4 соответствует правилам проверки.
Если вам нужны поля для контроля ошибок, вы можете это сделать.
Затем вам нужно объявить этот метод в
constructor
методе Like as.Вместо установки ошибки в ControlGroup сделайте это в фактическом поле следующим образом:
HTML-часть для группы паролей
источник