LiveValidation. Удалить не работает - PullRequest
9 голосов
/ 21 сентября 2010

У меня есть веб-форма, работающая с расширением LiveValidation.У меня есть условное правило, что если пользователь выбирает Соединенные Штаты, то поле «Штат или провинция» должно быть в списке сокращений штатов.

Моя проблема в том, что если пользователь выбирает Соединенные Штаты, а затем возвращаетсяи изменяет свой ответ, правило валидации должно быть удалено, чтобы они могли вводить любую старую текстовую строку.Я четыре раза проверил свой синтаксис, и функция возвращает объект liveValidation, а не объект ошибки, но правило не удаляется.Любой совет будет принята с благодарностью.

Вот сценарий:

            if($('#edit-submitted-state-or-province').length){    
            var field12 = new LiveValidation('edit-submitted-state-or-province', { validMessage: " ", onlyOnBlur: true });
            field12.add( Validate.Presence,  { failureMessage: "Please enter your state or province." }  );
            }
            $('#edit-submitted-country').change(function() {
                var stateList = new Array("","AK"..."WY");
                if($("#edit-submitted-country").val() == "United States"){
                    field12.add( Validate.Inclusion, {within: stateList, failureMessage: "Please enter a valid 2-letter state abbreviation."});
                }
                else{
                    field12.remove( Validate.Inclusion, {within: stateList, failureMessage: "Please enter a valid 2-letter state abbreviation."});
                }
            });

1 Ответ

4 голосов
/ 09 июня 2011

Возможно, слишком поздно, чтобы ответить на этот вопрос, но здесь идет ...

Документация для LiveValidation.remove гласит: «Вы должны передать ТОЧНО те же аргументы, которые вы использовали для добавления проверки». Хотя функция проверки (Validate.Inclusion) одинакова, объект параметров каждый раз будет отличаться. Неважно, что он «выглядит» одинаково (то есть, если вы сравниваете значение каждого свойства между добавленным и удаленным объектом), это означает, что это должно быть тот же объект . Единственный способ убедиться в этом - переместить объявление объекта параметров за пределы обратного вызова, в котором вы управляете объектом проверки, чтобы он создавался только один раз, а не каждый раз при вызове обратного вызова.

Вот код (я переименовал ваши идентификаторы, кстати). Я также убедился, что проверка может быть добавлена ​​только один раз.

$(function() {

var field12,
    added = false,
    stateList = ["", "AK", "CO", "WY"]; // etc
    params = {
        within: stateList,
        failureMessage: "Please enter a valid 2-letter state abbreviation."
    };    

if ($('#state').length) {    
  field12 = new LiveValidation('state', {
      validMessage: " ",
      onlyOnBlur: true
  });

  field12.add(Validate.Presence, {
      failureMessage: "Please enter your state or province."
  });

}

$('#country').change(function() {
  if ($("#country").val() == "United States") {
      if (!added) {
          field12.add(Validate.Inclusion, params);
          added = true;
      }
  }
  else {
      if (added) {
          field12.remove(Validate.Inclusion, params);
          added = false;
      }
  }
});

});
...