2010-09-29 27 views
8

Tengo problemas para validar un cuadro de diálogo de la interfaz de usuario jQuery usando Jquery Validate al hacer clic en Guardar.jQuery UI Diálogo + Validar

Aquí está mi código para crear el diálogo de Jquery. Se carga el diálogo desde un objetivo de una URL href:

$(document).ready(dialogForms); 

function dialogForms() { 
    $('a.dialog-form').click(function() { 
    var a = $(this); 
    $.get(a.attr('href'),function(resp){ 
     var dialog = $('<div>').attr('id','formDialog').html($(resp).find('form:first').parent('div').html()); 
     $('body').append(dialog); 
     dialog.find(':submit').hide(); 
     dialog.find('#return').hide(); 
     dialog.dialog({ 
     title: a.attr('title') ? a.attr('title') : '', 
     modal: true, 
     buttons: { 
      'Save': function() {submitFormWithAjax($(this).find('form'));}, 
      'Cancel': function() {$(this).dialog('close');} 
     }, 
     close: function() {$(this).remove();}, 
     width: 'auto' 
     }); 
    }, 'html'); 
    return false; 
    }); 
} 

function submitFormWithAjax(form) { 
    form = $(form); 
    $.ajax({ 
     beforeSend: function(data) { 
      //alert("beforesend"); 
      form.validate(); 
     }, 
     url: form.attr('action'), 
     data: form.serialize(), 
     type: (form.attr('method')), 
     dataType: 'text', 
     error: function(data) { 
      alert(data); 
      $('#result').html(data); 
     }, 
     success: function(data) { 
      //alert("success"); 
      $('#result').html(data); 
      setTimeout("reloadPage()", 500); 
     } 
    }); 
    return false; 
} 

El beforeSend se llama, pero no parece que llamar al método validate, que se encuentra en la página principal de la que se llama diálogo.

 $(document).ready(function() { 
      $("#event_form").validate({ 
       rules: { 
        Name: { 
         required: true 
        }, 
        Category: { 
         required: true 
        } 
       }, 
       messages: { 
        Name: "Please enter an event name", 
        Category: "Please choose a category" 
       }, 
       submitHandler: function(form) { 
        alert("validated"); 
        //     $('#loading_1').show(); 
        //     $('#proceed_c').hide(); 
        //     $(form).ajaxSubmit(); 
        //     //form.submit(); 
       }, 
       errorPlacement: function(error, element) { 
        error.appendTo(element.next(".status")); 
       } 
      }); 

} 

es el problema con la beforeSend dentro submitFormWithAjax function, la ubicación de $("#event_form").validate o la submitHandler: function(form) dentro de ella? Cualquier ayuda será apreciada.

+0

puedo decir que la clase '.error' se añade a los elementos cuando son válidos? –

Respuesta

7

Cuando inicializa el cuadro de diálogo jQueryUI, modifica el DOM, el diálogo completo se saca de su ubicación en la página y se inserta justo antes de la etiqueta </body>. Puedes ver esto con Firebug. Esto causa un problema para Validar, porque ahora el formulario está vacío. Para solucionar esto, en el evento abierto del diálogo, agréguelo al formulario. Suena muy loco, pero confía en mí, funciona :)

dialog.dialog({ 
    title: a.attr('title') ? a.attr('title') : '', 
    modal: true, 
    buttons: { 
     'Save': function() {submitFormWithAjax($(this).find('form'));}, 
     'Cancel': function() {$(this).dialog('close');} 
    }, 
    close: function() {$(this).remove();}, 
    open: function(){ 
     $(this).parent().appendTo($('#event_form')); 
    }, 
    width: 'auto' 
    }); 

Editar:

<form id='event_form'> 
    <div id="dialog" title="DialogTitle"> 
    </div> 
</form> 
+0

Intenté esto y no está funcionando. El diálogo ahora no aparece. Solo para aclarar, la página que llama al diálogo de jquery y mantiene la función dialogForms() (página de llamada) no contiene ningún elemento de formulario. La página de destino contiene un event_form y el script de validación jquery. ¿Son estos los lugares correctos para ellos? ¿El appendTo sigue siendo target event_form? – Dean

+1

Edité la respuesta para agregar la estructura que uso, el diálogo se aplica al div y se valida al formulario. El diálogo se agrega de nuevo al formulario. Todo esto, incluido el código jquery, está en un archivo separado y se carga en un emty div en mi página en un evento onclick(). –

+0

¡funciona! muchas gracias;) – frabiacca

2

adoptó un enfoque ligeramente diferente a este. Necesitaba volver a utilizar mi formulario modal por lo añado una vez jQuery "crea" el modal:

$("#mdl_Subject").dialog({ 
    autoOpen: false, 
    show: "drop", 
    hide: "drop", 
    modal: true, 
    create: function() { 
     $(this).parent().appendTo($('#aspnetForm')); 
    } 
}); 
+0

Se ha enviado la misma corrección modal para usar la opción appendTo tal como se sugiere aquí: http://bugs.jqueryui.com/ticket/9095. Creo que solo se ven afectadas las versiones más recientes de jquery ui (> = 1.10.2). – wtjones

Cuestiones relacionadas