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
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 eventosajax
se hayan completado. Por lo tanto, en este caso, los listenerssetRenderDialog
ysetEditablePatientIndex
se ejecutan antes del atributoupdate
del botón, lo que hace que el atributoupdate
se evalúe con el valor nulo depatientIndex
.Para solucionar esto, puedes intentar usar el atributo
actionListener
del botón en lugar de los eventosajax
. De esta manera, puedes asegurarte de que los valores booleanos se establezcan antes de que se evalúe el atributoupdate
.Por ejemplo:
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étodoupdateStudy
, 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.