jQuery ненавязчивый пользовательский адаптер и метод в jsFiddle
Я не могу заставить этот jsFiddle работать, но он работает в браузере: http://jsfiddle.net/vtortola/jYq2X/
Я пытаюсь добавить новое пользовательское правило для сравнения двух полей. Пользовательский адаптер работает, он вызывается и настраивает параметры. Но пользовательский метод никогда не вызывается.Я выполняю этот JS на DOM ready:
$.validator.addMethod("customequal-method", function (val, el, p) {
var $other = $(el).closest('form').find('input[name=' + p.other + ']');
return $other.length && $other.val() == val;
});
$.validator.unobtrusive.adapters.add("customequal", ["other"],
function (options) {
options.rules["customequal-method"] = options.params;
options.messages["customequal-method"] = options.message;
});
$(function(){
$.validator.unobtrusive.parse($('#myform'));
$('[type=button]').click(function(e){e.preventDefault(); $('form').valid();});
$('input[type=text]').blur();
})
Это поля в HTML:
<input type="text" name="StartDate2" id="StartDate2" value="2"
data-val="true" data-val-customequal="xx xxx" data-val-customequal-other="EndDate2"/>
<input type="text" name="EndDate2" id="EndDate2" value="3"
data-val="true" data-val-customequal="xx xx" data-val-customequal-other="StartDate2"/>
Я пробовал разные вещи, но ничего не похоже на работу.
Любой идея?
1 ответ:
Ваша Скрипка не работает, потому что:
Весь ваш код выполняется в DOM ready, поэтому вы добавляете свой пользовательский
unobtrusive.adapters.add
после ненавязчивого.плагин validator называетсяunobtrusive.parse(document)
, который регистрирует все входы без вашего пользовательского валидатораЕсли вы позвоните .validate() несколько раз он только регистрирует правила в первый раз и не переопределяет их при последующих вызовах. Поэтому, хотя вы снова позвонили
unobtrusive.parse
в DOM, загрузили это время с добавленным пользовательским адаптером все равно не будет иметь никакого эффекта.Таким образом, у вас есть два способа исправить это:
Зарегистрируйте свои пользовательские адаптеры перед событием загрузки DOM , Вы можете сделать это, изменив скрипку на use
"No wrap - in <head>"
Demo JSFiddle.
Или
Удалите уже добавленный объект validator С помощью
$('#myform').data('validator', null)
перед вызовомunobtrusive.parse
вручную:$(function () { $('#myform').data('validator', null); $.validator.unobtrusive.parse($('#myform')); $('[type=button]').click(function (e) { e.preventDefault(); $('form').valid(); }); $('input[type=text]').blur(); })
Demo JSFiddle.