javascript - recargar - primefaces commandbutton update
Expresión EL dentro de p: commandButton onclick no se actualiza/vuelve a renderizar en una solicitud ajax? (1)
En efecto. PrimeFaces (y JSF estándar) no vuelve a evaluar los atributos EL in on*
por solicitud. Solo ocurre en base a la vista. Sin embargo, RichFaces lo hace en los <a4j:xxx>
.
Tienes que resolver el problema de manera diferente. Sugiero usar el atributo visible
de <p:dialog>
lugar.
<h:form>
...
<p:commandButton value="Delete all friends?" update=":deleteDialogs" />
</h:form>
...
<h:panelGroup id="deleteDialogs">
<p:dialog id="deleteFriendsConfirmDialog" visible="#{facesContext.postback and not empty userBean.user.friendList}">
...
</p:dialog>
<p:dialog id="friendsAlreadyDeletedErrorDialog" visible="#{facesContext.postback and empty userBean.user.friendList}">
...
</p:dialog>
</h:panelGroup>
Una alternativa es utilizar PrimeFaces '' RequestContext
en el método de acción del bean que le permite ejecutar código JavaScript programáticamente en el método de acción de bean (aunque esto ajusta el controlador un poco demasiado con la vista, IMO).
<p:commandButton value="Delete all friends?" action="#{userBean.deleteAllFriends}" />
con
RequestContext context = RequestContext.getCurrentInstance();
if (!user.getFriendList().isEmpty()) {
context.execute("deleteFriendsConfirmDialog.show()");
} else {
context.execute("friendsAlreadyDeletedErrorDialog.show()");
}
Sin relación con el problema concreto, su onclick
original, aunque no funciona en su caso particular, muestra algunas prácticas deficientes. El javascript:
pseudoprotocol es superfluo. Ya es el predeterminado. Eliminarlo Además, la prueba contra == ''true''
es superflua. Eliminarlo Simplemente deje que EL imprima true
o false
directamente. La siguiente es la sintaxis correcta (nuevamente, esto no resuelve su problema, solo para su información)
<p:commandButton
onclick="if (#{not empty userBean.user.friendList}) deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
Hubiera funcionado si estuvieras usando RichFaces '' <a4j:commandButton>
.
<a4j:commandButton
oncomplete="if (#{not empty userBean.user.friendList}) deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
El atributo onclick
de mi commandButton
tiene algo de Javascript dependiente de EL dentro. Para ser más específico, aquí está esa pieza de código:
<p:commandButton
onclick="javascript: if(''#{userBean.user.friendList.size() gt 0}'' == ''true'') deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
deleteFriendsConfirmDialog
borra la lista de amigos y actualiza @form
. La lista de amigos, CommandButton y los cuadros de diálogo están todos en esa forma.
Así que hago clic en el botón, aparece el cuadro de diálogo de confirmación (porque la longitud de la lista de amigos es gt 0), confirmo y la lista se vacía, la vista se actualiza. Sin embargo, cuando hago clic en ¿ Delete all friends?
botón una vez más, el diálogo de confirmación vuelve a aparecer. Como la longitud de la lista ahora es 0, espero que aparezca el cuadro de diálogo de error.
Eso, supongo, es porque el Javascript escrito dentro de onclick
no se actualiza (aunque el botón está en el formulario).
Editar: Cambiar #{userBean.user.friendList.size() gt 0}
a #{not empty userBean.user.friendList}
tampoco funciona.
¿Cómo? ¿Qué pasa aquí?
Cualquier ayuda apreciada. :)