Почему JQuery Form submitHandler не обновляет свой обратный вызов? - PullRequest
1 голос
/ 03 июня 2009

Я использую плагин JQuery Form , плагин проверки JQuery и плагин jqTransform.

У меня есть скрытая форма, которую я делаю видимой, чтобы добавлять или редактировать вещи. Действия редактирования или добавления вызывают следующий вызов функции.

function activateAddForm(formId,callback) {
    $('#'+formId).jqTransform().validate({
            submitHandler: function(form) {
                $(form).ajaxSubmit( {
                    dataType: "json", 
                    success: function(json) {
                        callback(json);
                    }
                });                 
            }
        }); 
}

Каждый звонок с разными параметрами. Для добавления я называю это с

activateAddForm('add-new-form',addToy);

для редактирования, я называю это

activateAddForm('add-new-form',editToy);

Вот что происходит:

  • Перезагрузить страницу.
  • Редактировать одну игрушку.
  • Отправьте форму.
  • вызывается функция editToy.
  • Попробуйте добавить что-нибудь.
  • Функция activAddForm вызывается с addToy в качестве обратного вызова, но после отправки формы вызывается функция editToy.

Если первое, что я сделаю после перезагрузки, это добавлю игрушку. Тогда функция addToy всегда вызывается.

Я попытался добавить:

function activateAddForm(formId,callback) {
    $('#'+formId).ajaxFormUnbind();
    ...
}

или

function activateAddForm(formId,callback) {
    $('#'+formId).resetForm();
    ...
}

Но это не работает. Есть идеи, что я могу сделать?

Обходные испытания

Activa предлагает добавить строку:

$.removeData($('#'+formId)[0],'validator');

function activateAddForm(formId,callback) {
$('#'+formId).jqTransform();
$.removeData($('#'+formId)[0],'validator');
$('#'+formId).validate({
        submitHandler: function(form) {
            $(form).ajaxSubmit( {
                dataType: "json", 
                success: function(json) {
                    callback(json);
                }
            });                 
        }
    }); 
}

Следит за следующим:

  • Перезагрузите страницу.
    • Редактировать одну игрушку.
    • Отправьте форму.
    • Вызывается функция editToy.
    • Попробуйте добавить что-нибудь.
    • Вызывается функция editToy, затем вызывается функция добавления.

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

Есть еще идеи?

Ответы [ 4 ]

2 голосов
/ 18 января 2011

Я думаю, что гораздо проще, если вы просто измените submitHandler валидатора вместо того, чтобы поместить его в параметры функции validate.

$('#form').validate().settings.submitHandler = function () {
   // your function goes here.
}
$('#form').submit();
1 голос
/ 07 июня 2009

После проверки исходного кода плагина validator, кажется, что после вызова функции validate () последующие вызовы validate () не действуют.

Обходной путь может заключаться в следующем вызове перед вызовом validate ():

$.removeData($('#'+formId)[0],'validator');

EDIT:

Еще раз проверил ваш код, и я думаю, что нам нужно изменить стратегию: -)

function updateAddForm(formId,callback) {
$('#' + formId).data("successCallback",callback);
}

function initAddForm(formId) {
$('#'+formId).jqTransform()..validate({
        submitHandler: function(form) {
                $(form).ajaxSubmit( {
                        dataType: "json", 
                success: function(json) {
                        $('#'+formId).data("successCallback")(json);
                }
                        });                     
        }
    }); 
}

В начале звоните:

initAddForm('add-new-form');

Чтобы установить обратный вызов, вы звоните:

updateAddForm('add-new-form', addToy);

или

updateAddForm('add-new-form', editToy);

Это, вероятно, поможет.

1 голос
/ 27 сентября 2010
$('#comment').validate({
      rules:{
               comments:{required:true}
         },
    messages:{
               comments:{required:'Please enter the comment' }
          },
           submitHandler: function(form) { //asynchronusly post the form data

                        var url=MAIN_SITE_URL+'rating/getrate/';
                        var comments=$('#comments').val(); 
                        url+='rating/comment/'+comments;
                        $.post(url,$('#rating').serialize(),
                                             function(response){alert(response); }

           }
     });
0 голосов
/ 05 июня 2009

Недостаточно информации, чтобы ответить на ваш вопрос. Если вы работаете в Firefox, попробуйте установить плагин firebug и проверить элемент формы.

Из описания здесь я вижу, что вы, вероятно, используете два разных элемента формы с тем же идентификатором на той же странице. Первое, что я хотел бы сделать, это различить формы по уникальный элемент идентификатора, такой как: редактировать форма надстройка форма

просто мысль, я надеюсь, у кого-нибудь будет лучший ответ для вас.

...