我知道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之间的所有点击顺序组合工作正常,除了一个。如果我首先点击CommandLink与id =“botonAplazarSolicitudPertenenciaClub”,然后我点击CommandLink与id =“botonAceptarSolicitudPertenenciaClubAplazada”(到目前为止它工作),最后我点击CommandLink与id =“botonExpulsarSocio”,最后一个动作仅适用于第二个单击,我注意到没有呈现javax.faces.ViewState(它是在页面加载时)。
奇怪的是,当我点击带有id =“botonAceptarSolicitudPertenenciaClub”的CommandLink,然后点击id =“botonExpulsarSocio”的CommandLink时,它可以正常工作。
我不确定这里发生了什么,因为我认为我编写了代码来避免这个特定的错误。