Проверить поле внутри функции проверки - PullRequest
0 голосов
/ 07 сентября 2018

Это связано с этим вопросом: Проверка для выбора минимума и максимума

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

У меня есть следующий код

$.validator.addMethod('lessthan', function (value, element, params) {
  var greatElement, validator, less, greatText, isEqualValid, great;

  greatElement = $(params[0]);
  // This code does not work
  //validator = $( greatElement[0].form ).validate();
  //validator.element(greatElement);

  // This code does not work
  greatElement.valid();

  // validate the current value 
  // missing for brevety  
});

$.validator.unobtrusive.adapters.add('lessthan', ['compareto', 'isequalvalid'], function (options) {
  var element = $(options.form).find('input[name=' + options.params['compareto'] + ']')[0];
  options.rules['lessthan'] = [element, options.params['isequalvalid']];
  options.messages['lessthan'] = options.message;
});

Однако, когда я пытаюсь проверить другое поле для текущегополе, хотя aria-invalid не соответствует действительности, класс ошибок ввода-проверки не удаляется.

Как запустить проверку для другого поля внутри функции проверки?

ОБНОВЛЕНИЕ IСледует упомянуть, что мне нужно исправить ситуацию, когда проверка выполняется при изменении одного из полей (keyup или lostfocus).

Пример: у меня есть min 2 и max 5. Я изменяю min на 23 обаполя становятся недействительными и имеют связанный с ними класс ошибок. Я изменяю значение min на 3, только поле max становится действительным.Поле min остается недействительным, даже если функция проверки верна, которая является действительной.

1 Ответ

0 голосов
/ 10 сентября 2018

После дальнейших исследований я обнаружил свою проблему. Кажется, что когда вы вызываете функцию validator.element внутри, она устанавливает свойство currentElements. Таким образом, вы меняете текущий проверяемый элемент.

Итак, чтобы решить мою проблему, я устанавливаю currentElements обратно на проверяемый элемент

$.validator.addMethod('lessthan', function (value, element, params) {
  var greatElement, validator, less, greatText, isEqualValid, great;

  greatElement = $(params[0]);
  validator = $( greatElement[0].form ).validate();
  validator.element(greatElement);
  // THIS IS THE LINE ADDED
  validator.currentElements = $(element);

  // validate the current value 
  // missing for brevety  
});

$.validator.unobtrusive.adapters.add('lessthan', ['compareto', 'isequalvalid'], function (options) {
  var element = $(options.form).find('input[name=' + options.params['compareto'] + ']')[0];
  options.rules['lessthan'] = [element, options.params['isequalvalid']];
  options.messages['lessthan'] = options.message;
});

Конечно, вы можете получить предыдущие currentElements до вызова validator.element и установить его обратно после вызова.

Возможно, существует альтернатива группам, но кажется, что группы не поддерживаются с тегами html5, поэтому может быть сложнее реализовать.

ОБНОВЛЕНИЕ с правильным решением

Поскольку я не использую form.validate (настройки) и группы не поддерживаются тегами html5, мне пришлось реализовать альтернативное решение:

$(document).ready(function () {
  $('[data-val-lessthan-groupname]').each(function () {
     var validator = $(this.form).validate();
     validator.groups[this.name] = $(this).data('val-lessthan-groupname');
     validator.invalid[this.name] = true;
  });
});

Так что в основном я устанавливаю имя группы для минимума и максимума. В готовом документе я получаю валидатор и устанавливаю для элемента формы имя группы. Также я устанавливаю, что элемент действителен, в противном случае проверка будет выполняться только после того, как элемент будет «проверен» (установить фокус в элементе управления и потерять фокус на нем или отправить) [Кажется, что группа была разработана только с required_from_groups в помните, что он проверяет другие поля, если они имеют измененное значение]

...