Почему эта проверка JQuery с обратным вызовом не работает? - PullRequest
0 голосов
/ 31 марта 2011

Я довольно новичок в плагине проверки jquery. Попытка сравнить значения даты в двух полях и вызвать ошибку, если одна дата раньше другой. Вот разметка:

        <label>Last prescription fill date:</label>
        <input type="text" ID="InputLastPrescriptionFillDate" 
             style="width: 200px" 
             Class="calendarSelectInput dateComparison required" />
        <br />
        <label>Prescription start date:</label>
        <input type="text" ID="InputPrescriptionStartDate" name="InputPrescriptionStartDate" 
             style="width: 200px" 
             Class="calendarSelectInput dateComparison required" />

Вот jQuery.

$(document).ready(function() {
     $("form").validate({
            rules: {
                InputPrescriptionStartDate: {
                    required: compareRxDates()
                }
            },
            messages: {
                InputPrescriptionStartDate: {
                    required: "Last prescription fill date should not be after the prescription start date."
                }
            }
     });
});

И обратный вызов JavaScript.

function compareRxDates() {
    return new Date($("#InputPrescriptionStartDate").val()) < new Date($("#InputLastPrescriptionFillDate").val());
}

... который вызывается в document.ready, но не всякий раз, когда значения в полях изменяются. Я попытался обернуть form.validate в событие изменения этих полей, но эта функция по-прежнему не вызывается.

Что я делаю не так? Это даже правильный подход к тому, что я пытаюсь сделать?

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

Вот что у меня сработало:

jQuery.validator.addMethod("beforeFillDate", function(value, element) {
    var rxDate = new Date(value);
    var lastFillDate = new Date($("#InputLastPrescriptionFillDate").val());
    return rxDate > lastFillDate;
}, "Last prescription fill date should not be after prescription start date."); 

а потом ...

$("form").validate({ 
     rules: { InputPrescriptionStartDate: { beforeFillDate: true}} 
});
0 голосов
/ 31 марта 2011

Кажется, вы присваиваете compareRxDates() свойству required, которое должно быть логическим - истина или ложь, сообщая плагину, должно ли поле быть обязательным или нет. Вместо этого вы должны указать обратный вызов в свойстве depends.

Пример:

$("form").validate({
    rules: {
        InputPrescriptionStartDate: {
            depends: function(element) {
                compareRxDates();
            }
        }
    },
// etc

Из документации:

Каждое правило может быть указано как имеющее свойство зависимости для применения правила только в определенных условиях

ОБНОВЛЕНИЕ: (предлагая лучшее, многоразовое решение, с примером)

Вы можете добавить свои собственные методы проверки, которые вы можете использовать в других полях, например:

jQuery.validator.addMethod("shouldBeGreaterThan", function(value, currentElement, argumentElement) {
   return value > $(argumentElement).val();
}, "* This field should be greater than the other");

$("form").validate({
    rules: {
        InputPrescriptionStartDate: {
            shouldBeGreaterThan: $("#InputLastPrescriptionFillDate")
        }
    }
});

Функция addMethod получает 3 параметра. Имя метода, функция оценки и сообщение, которое будет отображаться в случае, если оно оценивается как false (может быть переопределено для отдельных элементов). В приведенном выше примере я создал метод проверки, который требует, чтобы элемент аргумента имел значение, которое должно быть больше текущего значения. Это можно легко изменить для работы с датами.

Вот jsfiddle с рабочим примером: http://jsfiddle.net/bZzrs/5/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...