jQuery Validate Plugin: Как я могу добавить группы в валидатор после его инициализации? - PullRequest
9 голосов
/ 28 января 2010

На нашем сайте мы используем встроенную регистрационную форму из нашего ESP, которая использует плагин проверки jQuery.Мы немного настраиваем форму, добавляем пару настраиваемых полей (имя, фамилия) и хотим, чтобы они были сгруппированы, поэтому для обоих полей имеется только одно сообщение об ошибке.

Поскольку валидатор формыуже инициализирован, мне нужно добавить несколько вещей динамически.Плагин предоставляет метод rules («add», rules) для динамического добавления в правила валидации, хотя мы в любом случае просто используем имена классов.Но нет четкого способа установить параметр groups после инициализации валидатора.

Я пробовал несколько разных вещей для достижения этой цели, но ни один из них не работал:

var settings = $("#mc-embedded-subscribe-form").validate().settings;
$("#mc-embedded-subscribe-form").validate($.extend(settings, {
    groups: {
        username: "FNAME LNAME"
    },
    errorPlacement: function(error, element) {
        if (element.attr("name") == "FNAME" || element.attr("name") == "LNAME") {
            error.insertAfter("#username_group");
        } else {
            error.insertAfter(element);
        }
    }
}));

Функция errorPlacement добавлена ​​в валидатор, но не в группы.

Я также пытался установить опцию групп явно, но это также не имеет никакого эффекта.

$("#mc-embedded-subscribe-form").validate().settings.groups = { username: "FNAME LNAME" };
$("#mc-embedded-subscribe-form").validate().groups = { username: "FNAME LNAME" };

IЯ полностью озадачен тем, как этого добиться.

Ответы [ 4 ]

10 голосов
/ 13 марта 2012

Недавно я столкнулся с той же проблемой и нашел другое решение.

Сценарий

У нас есть таблица, которая динамически увеличивается по мере того, как пользователи добавляют (или удаляют) строки. Каждая новая строка содержит несколько элементов, и мы хотим, чтобы входные элементы каждой строки были в одной группе проверки - по одной на строку - потому что мы хотим только одну метку ошибки для каждой строки. Поскольку строки добавляются динамически - задолго после того, как мы вызываем $ ('# the-form'). Validate () - нам нужен был способ добавления новой группы каждый раз, когда пользователь добавляет строку.

Наше решение

Мы взломали объект валидатора, напрямую изменив его член группы:

// on document ready:
validator = $('#the-form').validate({
    groups: ...,
    rules: ...,
    messages: ...,
    etc.
});

...

// later, when we need to add a new validation group:
validator.groups['first_name_row_5'] = 'full_name';
validator.groups['last_name_row_5'] = 'full_name';

Эти две последние строки эквивалентны

groups: {full_name: 'first_name_row5 last_name_row_5'}

в опциях валидатора, но может быть добавлено после первоначального вызова validate ().

Это взлом внутренностей jquery.validate, но он работает (с помощью jquery validate v1.9.0).


Наконец, прямо ответить на вопрос ОП: вместо этого:

$("#mc-embedded-subscribe-form").validate().groups = { username: "FNAME LNAME" };

попробуйте это:

var validator = $("#mc-embedded-subscribe-form").validate();
validator.groups['FNAME'] = 'username';
validator.groups['LNAME'] = 'username';
5 голосов
/ 12 марта 2011

Я тоже искал способ сделать это и нашел решение на справочном форуме jQuery: http://forum.jquery.com/topic/jquery-validate-defining-groups-dynamically

1 голос
/ 20 декабря 2012

Я пробовал все методы, которые я мог найти, чтобы динамически добавлять группы. Единственный, который работал для меня, был основан на методе Рона выше. У меня была таблица, в которой были динамически добавленные строки, каждая из которых содержала несколько полей.

// Names of fields within each table row that's dynamically added
var validateNames=["field1","field2","field3"];    

// This function overwrites all validator groups and is called during each change of the table
function createGroups() {

    var result = {};

    // Create any static groups    
    result['date-dd'] = result['date-mm'] = result['date-yyyy'] = 'date';

    // Create groups from dynamically added table rows
    var i = 1;
    jQuery("tr", "#table-id tbody").each(function() {

        for (j = 0; j < validateNames.length; ++j) {
            result[validateNames[j] + "-" + i] = 'fieldGroup_' + i;
        }

        i++;
    });    

    validator.groups = result;
}
0 голосов
/ 13 декабря 2010

положить один элемент errorElement: «span», который используется для отображения ошибки в нужном месте. где user__group кодировать внутри тега span

$("#mc-embedded-subscribe-form").validate($.extend(settings, {     

групп: {
имя пользователя: "FNAME LNAME"},
errorElement: "span" ,

errorPlacement: function (error, element) {
if (element.attr ("name") == "FNAME" || element.attr ("name") == "LNAME") { error.insertAfter ( "# username_group");
} else {
error.insertAfter (элемент);

}}}));

...