Есть ли способ сравнить даты на Valdr?
Я использую Valdr в своем проекте, и мне нужно проверить, что ввод даты "startDate" предшествует вводу другой даты "endDate".
<input id="startDate" name="startDate" type="text" ng-model="project.startDate"/>
<input id="endDate" name="endDate" type="text" ng-model="project.endDate"/>
Я знаю, что без Valdr эту проблему можно решить с помощью пользовательской директивы, как показано здесь: Директива для сравнения двух дат
Я нашел немного неясным, как создать собственный валидатор в Valdr, который использует значения других полей.
4 ответа
Ответ короткий, но неудовлетворительный: valdr в настоящее время не поддерживает это. Однако на GitHub есть запрос на открытую функцию.
Вы можете пойти с этим решением:
- Получите значение bool, рассчитанное при изменениях в любом из полей даты - значение, показывающее, выполняется ли правило проверки
- Создайте простой пользовательский валидатор, чтобы проверить, является ли это значение истинным или нет
- Зарегистрируйте свой валидатор и добавьте ограничение для этого вычисленного значения
- Поместите скрытый ввод для этого вычисленного значения в любое место, где должно появиться ваше сообщение проверки
На самом деле вы можете решить эту проблему с помощью специального валидатора, который может получить другое поле и сравнить значения друг с другом. Приведенный ниже код использует valdr-bean-validation для генерации на сервере valodation.json.
Если вы хотите использовать его без этого, просто посмотрите на код JS и добавьте валидатор в ваш validation.json вручную.
Java-аннотация (серверное объявление валидатора valdr):
package validation;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR,
ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
public @interface DateFormat {
String message();
Class[] groups() default { };
String beforeFieldName();
}
Java Bean (использование аннотации, этот класс должен использоваться в генерации validation.json):
package pojo;
import validation.DateFormat;
public class RegistrationPojo implements BasePojo {
@NotNull(message = "message.date1.required")
private Date date1;
@NotNull(message = "message.date2.required")
@DateFormat(message = "message.date2.date", beforeFieldName = "date1")
private Date date2;
}
JS (реализация пользовательского валидатора и регистрация его в valdr):
module.factory('validation.DateFormat', [
function () {
return {
name: 'validation.DateFormat',
validate: function (value, constraint) {
var minOk = true;
var maxOk = true;
var format = false; // constraint.pattern is mandatory
//do not validate for required here, if date is null, date will return true (valid)
console.log("my date validator called");
console.log(" beforeFieldName: " + constraint.beforeFieldName);
var field = document.querySelector('[name="' + constraint.beforeFieldName + '"]');
console.log("field value: " + (field ? field.value : "null"));
return (!field || value > field.value);
}
};
}]);
module.config([
"valdrProvider",
function(valdrProvider) {
valdrProvider.addValidator('validation.DateFormat');
}]);
До тех пор, пока эта функция не будет реализована в valdr, вы можете использовать свою собственную директиву validator и заставить ее общаться с valdr. Директива может требовать "форму" и может получать имена моделей дат, которые вы хотите сравнить. Затем вы делаете свою логику, чтобы сравнить два значения и установить допустимость соответствующего 'ngModelController'. Так как вам нужно указать ошибку при установке достоверности для этой модели, именем ошибки будет ваше соединение с valdr.
После этого вам просто нужно отобразить ошибку в сервисе 'valdrMessage':
.run(function (valdrMessage) {
valdrMessage.angularMessagesEnabled = true;
valdrMessage.addMessages({
'date': 'Invalid date!'
});
});
Valdr, как обычно, покажет сообщение ниже недействительного поля.