Проверить другое поле, не вызывая бесконечный цикл - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть ситуация, когда я создаю ненавязчивый валидатор, который должен подтвердить, что требуется другое поле, только если проверяемое поле не пустое (и наоборот). Проблема в том, что есть некоторые крайние случаи, когда другое поле не проходит повторную проверку, и я хотел бы заставить его выполнить повторную проверку, не вызывая бесконечный цикл.

Мой метод проверки выглядит так:

$.validator.addMethod("jqiprequired", function (value, element, params) {
    if (!this.optional(element) || (this.optional(params) && this.optional(element))) {
        return true;
    }

    return false;
});

params - это мое другое поле (оба являются текстовыми полями). Если оба являются пустыми, он проходит, если оба имеют значения, он проходит. Это только терпит неудачу, если только у одного есть значение.

Это работает нормально, за исключением того, что если одно поле пустое, а другое имеет значение, то вы удаляете значение из поля со значением, пустое поле не проверяется повторно (поскольку его значение не изменилось).

Я пытался сделать это:

if (!this.optional(element) || (this.optional(params) && this.optional(element))) {
    $('form').validate().element(params);
    return true;
}

Но это вызывает бесконечный цикл, потому что каждый раз, когда он проходит, он вызывает другой.

Как я могу заставить другое поле для проверки без вызова самого исходного поля?

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

Вместо добавления атрибута в каждое поле попробуйте добавить переменную jqip_validating в сценарий, в который вы добавляете этот метод проверки.Затем измените свою валидацию следующим образом:

var jqip_calledFromOtherValidator = false;
if (jqip_validating) {
    jqip_validating = false;
    jqip_calledFromOtherValidator = true;
}
if (!this.optional(element) || (this.optional(params) && this.optional(element))) {
    if (!jqip_validating && !jqip_calledFromOtherValidator) {
        jqip_validating = true;
        $('form').validate().element(params);
    }
    return true;
}

Чтобы был вызван другой валидатор, оба условия должны быть выполнены, и они могут быть выполнены только тогда, когда первый валидатор вызовет второй валидатор.

0 голосов
/ 12 сентября 2011

Вы можете добавить атрибут is_validating к каждому полю, чтобы, если он включен, пропустить проверку, а если нет, установить значение true, выполнить проверку и затем очистить ее.

...