es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El oncomplete con commandButton no está funcionando.

Tengo una tabla de datos anidada que tiene un botón de comando de edición, que muestra un cuadro de diálogo modal.

<p:commandbutton value="Editar" oncomplete="PF('editStudy').show()" type="button">
                <p:ajax event="click" listener="#{queryStudiesBean.setRenderDialog(true)}" update="editDialogStudy"></p:ajax>
                <p:ajax event="click" listener="#{queryStudiesBean.setEditableStudyIndex(studyIndex)}" update="editDialogStudy:"></p:ajax>
                <p:ajax event="click" listener="#{queryStudiesBean.setEditablePatientIndex(patientIndex)}" update="editDialogStudy"></p:ajax>
</p:commandbutton>

Estaba solucionando el problema de mantener las filas de la tabla secundaria expandidas después de una actualización, estaba siguiendo esta respuesta, pero me encontré con otro problema. Una vez que cargo la página de la tabla de datos, incluso antes de hacer clic en el botón Editar, se evalúa el botón de comando del cuadro de diálogo que tiene el atributo de actualización.

<p:commandbutton process="@form" update="@form,:form2:patient-dt:#{queryStudiesBean.editablePatientIndex}:study-dt" action="#{queryStudiesBean.updateStudy()}" oncomplete="PF('editStudy').hide()" value="Guardar" styleclass="fixed-button-size"></p:commandbutton>

Esto genera un error nulo ya que patientIndex todavía es nulo, ya que ni siquiera hice clic en el botón de edición de la tabla de datos para establecer patientIndex.

Así que logré solucionarlo agregando el atributo rendered="#{queryStudiesBean.renderDialog}" al cuadro de diálogo.

Ahora tengo dificultades para establecer este booleano en verdadero en la acción del botón de edición, el diálogo no se muestra en este momento. En el código anterior, utilicé oncomplete y configuré el valor booleano en <p:ajax> (ni el atributo action ni <f:setpropertyactionlistener> me funcionan), pensé que el booleano se establecería en verdadero antes de que se llamara a oncomplete, por lo que el diálogo se mostraría, pero esto no sucede. ¿Alguien puede explicarme por qué? Vi muchos mensajes, pero ninguno funcionó para mí.

Ver código completo de la tabla de datos

Ver código completo del cuadro de diálogo

Estoy usando:
primefaces 6.2,
java8

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con el orden de ejecución en el código. El atributo oncomplete del botón de comando se ejecuta después de que todos los eventos ajax se hayan completado. Por lo tanto, en este caso, los listeners setRenderDialog y setEditablePatientIndex se ejecutan antes del atributo update del botón, lo que hace que el atributo update se evalúe con el valor nulo de patientIndex.

    Para solucionar esto, puedes intentar usar el atributo actionListener del botón en lugar de los eventos ajax. De esta manera, puedes asegurarte de que los valores booleanos se establezcan antes de que se evalúe el atributo update.

    Por ejemplo:

    <p:commandbutton value="Editar" type="button" actionlistener="#{queryStudiesBean.prepareStudyForEdit(studyIndex, patientIndex)}" oncomplete="PF('editStudy').show()"></p:commandbutton>
    
    <p:commandbutton process="@form" value="Guardar" action="#{queryStudiesBean.updateStudy}" oncomplete="PF('editStudy').hide()" update="@form,:form2:patient-dt:#{queryStudiesBean.editablePatientIndex}:study-dt" rendered="#{queryStudiesBean.renderDialog}"></p:commandbutton>
    

    En el método prepareStudyForEdit, puedes establecer los valores booleanos y también almacenar los índices del estudio y el paciente seleccionados. Luego, en el método updateStudy, puedes acceder a estos índices para actualizar los registros correctos del estudio y el paciente.

    ¡Espero que esto sea de ayuda! Déjame saber si tienes alguna pregunta adicional.

Comments are closed.