我知道 jsf 表单中的 ajax 渲染存在问题,所以我编写了这样的代码来(据说)避免这个问题:
<h:panelGroup id="solicitudesPendientes" layout="block" styleClass="seccion">
<h:panelGroup rendered="#{!gestionSociosControlador.haySolicitudesPendientes()}">
No hay solicitudes pendientes de revisión
</h:panelGroup>
<h:form id="gestionSolicitudesPendientesForm" prependId="false">
<h:dataTable id="solicitudesPendientesTbl" styleClass="dataTable" rendered="#{gestionSociosControlador.haySolicitudesPendientes()}"
value="#{gestionSociosControlador.getSolicitudesPendientes()}" var="solicitud">
<h:column>
#{solicitud.solicitante.nombre} #{solicitud.solicitante.apellidos}
</h:column>
<h:column>
<span class="imgLnkInline">
<h:commandLink id="botonAceptarSolicitudPertenenciaClub"
action="#{gestionSociosControlador.aceptarSolicitud(solicitud.id)}">
<h:graphicImage url="/resources/images/silkIcons/accept.png" /> Aceptar
<f:ajax execute="@this" render="@form :gestionSocios :gestionSociosForm" />
</h:commandLink>
</span>
<span class="imgLnkInline">
<h:commandLink id="botonRechazarSolicitudPertenenciaClub"
action="#{gestionSociosControlador.rechazarSolicitud(solicitud.id)}">
<h:graphicImage url="/resources/images/silkIcons/delete.png" /> Rechazar
<f:ajax execute="@this" render="@form :solicitudesPendientes" />
</h:commandLink>
</span>
<span class="imgLnkInline">
<h:commandLink id="botonAplazarSolicitudPertenenciaClub"
action="#{gestionSociosControlador.aplazarSolicitud(solicitud.id)}">
<h:graphicImage url="/resources/images/silkIcons/date_next.png" /> Decidir mas tarde
<f:ajax execute="@this" render="@form :solicitudesPendientes :gestionSolicitudesAplazadasForm" />
</h:commandLink>
</span>
</h:column>
</h:dataTable>
<h:messages id="gestionSolicitudesPendientesMsgs" for="gestionSolicitudesPendientesForm" layout="table"
errorClass="errorMessage" infoClass="infoMessage" warnClass="warnMessage" />
</h:form>
<h:panelGroup rendered="#{gestionSociosControlador.haySolicitudesAplazadas()}">
<span id="mostrarSolicitudesAplazadasLnk" class="imgLnkInline" onclick="mostrarSolicitudesAplazadas()" style="cursor:pointer">
<h:graphicImage url="/resources/images/silkIcons/bullet_toggle_plus.png" /> Ver #{gestionSociosControlador.getSolicitudesAplazadas().size()} solicitudes ocultas
</span>
<h:form id="gestionSolicitudesAplazadasForm" prependId="false">
<h:dataTable id="solicitudesAplazadasTbl" styleClass="dataTable" style="display:none"
value="#{gestionSociosControlador.getSolicitudesAplazadas()}" var="solicitud">
<h:column>
#{solicitud.solicitante.nombre} #{solicitud.solicitante.apellidos}
</h:column>
<h:column>
<span class="imgLnkInline">
<h:commandLink id="botonAceptarSolicitudPertenenciaClubAplazada"
action="#{gestionSociosControlador.aceptarSolicitud(solicitud.id)}">
<h:graphicImage url="/resources/images/silkIcons/accept.png" /> Aceptar
<f:ajax execute="@this" render="@form :gestionSocios :gestionSociosForm :solicitudesPendientes :gestionSolicitudesAplazadasForm" />
</h:commandLink>
</span>
<span class="imgLnkInline">
<h:commandLink id="botonRechazarSolicitudPertenenciaClubAplazada"
action="#{gestionSociosControlador.rechazarSolicitud(solicitud.id)}">
<h:graphicImage url="/resources/images/silkIcons/delete.png" /> Rechazar
<f:ajax execute="@this" render="@form :solicitudesPendientes :gestionSolicitudesAplazadasForm" />
</h:commandLink>
</span>
</h:column>
</h:dataTable>
<h:messages id="gestionSolicitudesAplazadasMsgs" for="gestionSolicitudesAplazadasForm" layout="table"
errorClass="errorMessage" infoClass="infoMessage" warnClass="warnMessage" />
</h:form>
<span id="ocultarSolicitudesAplazadasLnk" class="imgLnkInline" onclick="ocultarSolicitudesAplazadas()" style="display:none">
<h:graphicImage url="/resources/images/silkIcons/bullet_toggle_minus.png" /> Ocultar solicitudes aplazadas
</span>
</h:panelGroup>
</h:panelGroup>
<div class="tituloSeccion"><h3>Miembros</h3></div>
<h:panelGroup id="gestionSocios" layout="block" styleClass="seccion">
<h:panelGroup rendered="#{!gestionSociosControlador.haySocios()}">
El club no tiene socios.
</h:panelGroup>
<h:form id="gestionSociosForm" prependId="false">
<h:dataTable id="sociosTbl" styleClass="dataTable" rendered="#{gestionSociosControlador.haySocios()}"
value="#{gestionSociosControlador.getSocios()}" var="socio">
<h:column>
#{socio.nombre} #{socio.apellidos}
</h:column>
<h:column>
<span class="imgLnkInline">
<h:commandLink id="botonExpulsarSocio" action="#{gestionSociosControlador.expulsarSocio(socio.id)}">
<h:graphicImage url="/resources/images/silkIcons/user_delete.png" /> Expulsar
<f:ajax execute="@this" render="@form :gestionSocios" />
</h:commandLink>
</span>
</h:column>
</h:dataTable>
<h:messages id="gestionSociosMsgs" for="gestionSociosForm" layout="table"
errorClass="errorMessage" infoClass="infoMessage" warnClass="warnMessage" />
</h:form>
</h:panelGroup>
CommandLinks 之间的所有点击顺序组合都可以正常工作,除了一个。如果我首先单击 id="botonAplazarSolicitudPertenenciaClub" 的 CommandLink,然后单击 id="botonAceptarSolicitudPertenenciaClubAplazada" 的 CommandLink(到目前为止它有效),最后我单击 id="botonExpulsarSocio" 的 CommandLink,最后一个操作仅在第二个有效单击,我注意到 javax.faces.ViewState 没有呈现(它是在页面加载时)。
奇怪的是,当我单击 id="botonAceptarSolicitudPertenenciaClub" 的 CommandLink,然后单击 id="botonExpulsarSocio" 的 CommandLink 时,它可以正常工作。
我不确定这里发生了什么,因为我认为我编写代码是为了避免这个特定的错误。