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 2

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.