2011-05-19 24 views
9

Estoy usando Rails 3 con jQuery, y tengo un formulario simple con una sola entrada de texto y un botón de enviar. Tengo el formulario que se envía con :remote => true, y me gustaría borrar la entrada después de se envía el formulario. Probé este código jQuery:Clear Rails forma remota después de enviar

$('#new_message').submit(function() { 
    $('#message_content').val(''); 
}); 

Sin embargo, esto se borra la entrada antes de se envía el formulario, por lo que me acaban de enviar un formulario en blanco.

Después de buscar un poco, también probé la siguiente versión:

$('#new_message').submit(function(e) { 
    e.preventDefault(); 
    this.submit(); 
    $('#message_content').val(''); 
}); 

... pero esto parece anular la magia :remote => true, y la forma consigue presentar con una recarga de la página completa. ¿Algunas ideas?

Respuesta

20

Cuando botón de enviar se presiona para un formulario marcado remote => true, código de JavaScript en rails.js hace el submit(). No necesita anular la funcionalidad.

probar este lugar en $(document).ready -

(Edit:.. Utilizar unen en lugar de en vivo Gracias Darren Hicks)

$("#new_message").bind("ajax:complete", function(event,xhr,status){ 
    $('#message_content').val(''); 
} 

Esto añade un controlador de eventos para el evento ajax:complete. Este evento se dispara cuando se completa el formulario de presentación de ajax. Más here.

+0

Oooh, ¿esto funciona? Eso es genial. – CharlieMezak

+0

¡Agradable! Usé su código pero cambié el evento a 'ajax: beforeSend', que borra la entrada inmediatamente después del envío (en lugar de esperar a que la solicitud se complete), pero todavía envía los datos correctamente. ¡Gracias por excavar esto! – Grantovich

+0

¿Cómo puedes hacer esto en Coffeescript? – tibbon

0

En su función jquery, hágalo usted mismo a través del get(). Establece el campo de texto en blanco justo después de llamar a get(). O bien, puede hacerlo en la devolución de llamada de éxito que proporciona a get(), que le permitirá recuperar información de su controlador, por ejemplo, si el valor del campo de texto enviado fue aceptable.

+0

Hmm ... No tengo dudas de que esto funciona, pero parece que en el primer lugar no se debe usar ': remote => true', ya que prácticamente se está reutilizando toda su funcionalidad. Podría hacer esto como último recurso, pero me sorprendería (y me decepcionaría) si esta es la única forma de hacerlo. – Grantovich

1

En el archivo .js.erb acción

$('#message_content').attr('value',''); 

Dónde acción es el nombre del método (que no lo expresa en su pregunta) en su controlador

+0

Pensé en esto, pero significaría esperar a que se procesara toda la solicitud/respuesta antes de que se borre la entrada, lo que parece bastante lento (y podría dar lugar a múltiples presentaciones de formularios si el usuario se impacienta). La solución de enlace de eventos de abhishek, usando 'ajax: beforeSend', borra la entrada inmediatamente. – Grantovich

+0

, su usuario puede estar molesto si la llamada ajax falla por alguna razón y ha borrado su casilla de entrada. ¿Reciben alguna otra pista visual de que la solicitud ha tenido éxito? – Nick

+0

La interfaz en cuestión es una sala de chat básica, por lo que cuando la solicitud vuelve, el mensaje del usuario aparece en el chat. Creo que en este escenario la capacidad de respuesta es más importante que poder volver a enviar su mensaje sin volver a escribirlo, aunque creo que también podría guardar el mensaje enviado al lado del cliente y mostrarlo de nuevo al usuario (permitiéndoles copiarlo y pegarlo) si el Ajax falla – Grantovich

0

Puede desencadenar un Rieles AJAX presentar la siguiente manera:

$(this).trigger('submit.rails'); 
0

En sus model.js el archivo

   $('#element_id').val(' '); 

de que funcione para mí, puede probar esto.

Cuestiones relacionadas