LiveValidation .remove не работает

У меня есть веб-форма, работающая с расширением 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."});
                }
            });

person Colin    schedule 20.09.2010    source источник
comment
У меня такая же проблема. Из-за этого пришлось отказаться от LiveValidation :(.   -  person benr75    schedule 05.04.2011
comment
Используйте firebug для просмотра возможных ошибок Javascript. Есть ли ошибки js?   -  person sergzach    schedule 27.05.2011


Ответы (1)


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

В документации для 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;
      }
  }
});

});
person jmbucknall    schedule 08.06.2011