Есть ли способ сравнить даты на 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 есть запрос на открытую функцию.

Вы можете пойти с этим решением:

  1. Получите значение bool, рассчитанное при изменениях в любом из полей даты - значение, показывающее, выполняется ли правило проверки
  2. Создайте простой пользовательский валидатор, чтобы проверить, является ли это значение истинным или нет
  3. Зарегистрируйте свой валидатор и добавьте ограничение для этого вычисленного значения
  4. Поместите скрытый ввод для этого вычисленного значения в любое место, где должно появиться ваше сообщение проверки

На самом деле вы можете решить эту проблему с помощью специального валидатора, который может получить другое поле и сравнить значения друг с другом. Приведенный ниже код использует 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, как обычно, покажет сообщение ниже недействительного поля.

Другие вопросы по тегам