Presentar otra forma por ajax hace que se pierda su estado de vista, ¿cómo lo agrego?

yo tengo

              

Cuando hago clic una vez en “my_fake_ajax_link”, debo hacer doble clic en el enlace “Eliminar”. Esto es solo un ejemplo. No tengo este caso real. Tengo varios formularios en una página y no puedo simplemente agregarlos todos en una sola forma.

Verifiqué cuál es el problema y es:

  • Cuando haces clic en “my_fake_ajax_link”, el mydiv actualiza con ajax como debería.
  • ViewState de la forma actualizada en ajax falta.

¿Cómo puedo agregar ViewState? ¿Cómo puedo hacer que funcione sin usar solo una forma? Esto se parece a un error JSF para mí. No quiero actualizar esa div automáticamente con

 jQuery("#mydiv").load(document.location.href); 

pero lo haré en mi peor caso posible.

Este es un problema conocido en la biblioteca jsf.js incluida jsf.js de JSF que maneja respuestas ajax. Consulte también la especificación JSF número 790 que se soluciona en el próximo JSF 2.3. Mientras tanto, con JSF 2.0 / 2.1 / 2.2, debe especificar explícitamente el ID de la otra dentro de la anotación de render para activar la adición apropiada del estado de la vista.

               

No, esto no causa ninguna sobrecarga o duplicación de marcado en la respuesta de ajax. Alternativamente, use OmniFaces fixviewstate.js .

Ver también:

  • Comunicación en JSF 2.0 – Redacción Ajax de contenido que contiene otra forma
  • h: commandButton / h: commandLink no funciona con el primer clic, funciona solo con un segundo clic

Solución para eso:

En primer lugar, debe configurar un manejador de onevent para el botón que envía la solicitud ajax:

      

Luego debe declarar estos métodos de JavaScript que tomarán el valor de viewState correcto y lo agregarán a todos los formularios que no lo tengan:

  function fixOtherFormsViewState(data, goodFormId) { if (data.status != "success") { return; } var viewState = jQuery("#" + goodFormId + " input[name='javax.faces.ViewState']").val(); jQuery("form:not(:contains(input[name='javax.faces.ViewState']))").each(function (idx, elem) { var form = jQuery(elem); var input = jQuery("<input type='hidden' name='javax.faces.ViewState' />").val(viewState); form.append(input); }); }