A4J:commandLink双击后执行动作双击、动作、A4J、commandLink

2023-09-10 16:58:00 作者:弄丢了的岁月*

我的用户有一个 A4J表:commandLink 这将删除相应的用户,但问题是,我需要点击两次执行的操作,如何我可以解决这个问题,这里的code:

 < H:格式ID =formUsuariosRegistrados>
                <丰富:dataScroller为=usersTablefastControls =隐藏
                                   boundaryControls =隐藏/>
                <丰富:dataTable中的id =usersTable行=10VAR =用户
                                值=#{administrationBean.tablaUsuarios}>
                    < F:面名=标头>
                        <丰富:columnGroup>
                            <丰富:列>
                                < H:的outputText值=农布雷/>
                            < /富:列>
                            <丰富:列>
                                < H:的outputText值=Usuario/>
                            < /富:列>
                            <丰富:列>
                                < H:的outputText值=Dependencia/>
                            < /富:列>
                            <丰富:列>
                                < H:的outputText值=电子邮件/>
                            < /富:列>
                            <丰富:列>
                                < H:的outputText值=TIPO usuario/>
                            < /富:列>
                            <丰富:列>
                                < H:的outputText值=TIPO dependencia/>
                            < /富:列>
                            <丰富:列>
                                < H:的outputText值=出生日期LIMITE/>
                            < /富:列>
                            <丰富:列>
                                < H:的outputText值=/>
                            < /富:列>
                        < /富:columnGroup>
                    < / F:面>
                    <丰富:列>
                        < H:的outputText值=#{user.nombre}/>
                    < /富:列>
                    <丰富:列>
                        < H:的outputText值=#{user.usuario}/>
                    < /富:列>
                    <丰富:列>
                        < H:的outputText值=#{user.dependencia}/>
                    < /富:列>
                    <丰富:列>
                        < H:的outputText值=#{user.correo}/>
                    < /富:列>
                    <丰富:列>
                        < H:的outputText值=#{user.tipoUsuario}/>
                    < /富:列>
                    <丰富:列>
                        < H:的outputText值=#{user.tipoDependencia}/>
                    < /富:列>
                    <丰富:列>
                        < H:的outputText值=#{user.fechaLimiteCarga}/>
                    < /富:列>
                    <丰富:列>
                        < A4J:commandLink值=Eliminar立即=真
                                         执行=@表
                                         的onclick =返回确认('埃斯塔塞古罗(一)阙deseea continuar?)
                                         渲染=@形式:formFechaLimite:formModificarContrasena
                                         行动=#{administrationBean.doEliminarUsuario(user.usuario)}/>
                    < /富:列>
                < /富:dataTable的>
            < /小时:形式GT;
 

更新

下面是另一块,我加入了同样的看法code,但现在发生的两件事情:

在当前的看法是第一次加载,如果我点击 A4J:commandLink 在桌子上,动作被称为细。 在做1,当我尝试检查(或取消)的℃后; H:sekectBooleanCheckBox> 现在这部分点击两次后执行AJAX

我试了一下BalusC的回答说,但我觉得我没有做它用这种新形式的权利。

有那些好用的监控流量的软件

请指教,欢呼声

 < H:格式ID =formFechaLimite>
        <丰富:面板风格=宽度:400像素ID =panelFechaLimite>
            < F:面名=标头>
                < H:的outputText值=出生日期LIMITE德carga/>
            < / F:面>

            < H:outputLabel为=fechaLimite值=出生日期Limite的/>
            < BR />
            <丰富:日历ID =fechaLimite
                           值=#{administrationBean.fechaLimite}
                           datePattern =DD / MM / YYYY>
                < A4J:AJAX事件=变渲染=usuarios fechaLimiteModificada
                          听众=#{administrationBean.doHideEtiquetaFechaModificada}/>
            < /富:日历>
            < BR />
            < H:outputLabel为=todosUsuarios
                           值=Aplicar一个待办事项洛杉矶us​​uarios?/>
            &所述; H:selectBooleanCheckbox的id =todosUsuarios
                                     值=#{administrationBean.fechaTodosUsuarios}>
                < A4J:AJAX事件=变渲染=usuarios fechaLimiteModificada
                          听众=#{administrationBean.doCheckBoxChanged}/>
            < / H:selectBooleanCheckbox>
            < BR />
            &所述; A4J:outputPanel的id =usuarios>
                <丰富:选择值=#{administrationBean.selectedUser}
                             defaultLabel =语言Seleccione未usuario ......
                             渲染=#{不administrationBean.fechaTodosUsuarios}>
                    < F:selectItems的值=#{administrationBean.selectUser}/>
                    < A4J:AJAX事件=选择信息渲染=fechaLimiteModificada
                              听众=#{administrationBean.doHideEtiquetaFechaModificada}/>
                < /富:选择>
            < / A4J:outputPanel>
            < BR />< BR />
            < A4J:的commandButton值=Aplicar执行=@表
                               渲染=@形式:panelUsuarios:formUsuariosRegistrados:usersTable
                               行动=#{administrationBean.doCambiarFechaLimite}/>
            &所述; A4J:outputPanel的id =fechaLimiteModificada>
                < H:的outputText值=出生日期LIMITE modificada!
                              渲染=#{administrationBean.renderedEtiquetaFechaModicada}
                              风格=颜色:#D17100;字体大小:14px的;/>
            < / A4J:outputPanel>
        < /富:面板>
        < BR />
    < /小时:形式GT;

    < BR />

    <丰富:面板风格=宽度:800pxID =panelUsuarios>
        < F:面名=标头>
            < H:的outputText值=Administración德usuarios/>
        < / F:面>
        < H:格式ID =formUsuariosRegistrados>
            <丰富:dataScroller为=usersTablefastControls =隐藏
                               boundaryControls =隐藏/>
            <丰富:dataTable中的id =usersTable行=10VAR =用户
                            值=#{administrationBean.tablaUsuarios}>
                < F:面名=标头>
                    <丰富:columnGroup>
                        <丰富:列>
                            < H:的outputText值=农布雷/>
                        < /富:列>
                        <丰富:列>
                            < H:的outputText值=Usuario/>
                        < /富:列>
                        <丰富:列>
                            < H:的outputText值=Dependencia/>
                        < /富:列>
                        <丰富:列>
                            < H:的outputText值=电子邮件/>
                        < /富:列>
                        <丰富:列>
                            < H:的outputText值=TIPO usuario/>
                        < /富:列>
                        <丰富:列>
                            < H:的outputText值=TIPO dependencia/>
                        < /富:列>
                        <丰富:列>
                            < H:的outputText值=出生日期LIMITE/>
                        < /富:列>
                        <丰富:列>
                            < H:的outputText值=/>
                        < /富:列>
                    < /富:columnGroup>
                < / F:面>
                <丰富:列>
                    < H:的outputText值=#{user.nombre}/>
                < /富:列>
                <丰富:列>
                    < H:的outputText值=#{user.usuario}/>
                < /富:列>
                <丰富:列>
                    < H:的outputText值=#{user.dependencia}/>
                < /富:列>
                <丰富:列>
                    < H:的outputText值=#{user.correo}/>
                < /富:列>
                <丰富:列>
                    < H:的outputText值=#{user.tipoUsuario}/>
                < /富:列>
                <丰富:列>
                    < H:的outputText值=#{user.tipoDependencia}/>
                < /富:列>
                <丰富:列>
                    < H:的outputText值=#{user.fechaLimiteCarga}/>
                < /富:列>
                <丰富:列>
                    < A4J:commandLink值=Eliminar立即=真
                                     执行=@表
                                     onfocus此=返回确认('埃斯塔塞古罗(一)阙deseea continuar?)
                                     渲染=@形式:formFechaLimite:formModificarContrasena
                                     行动=#{administrationBean.doEliminarUsuario(user.usuario)}/>
                < /富:列>
            < /富:dataTable的>
        < /小时:形式GT;

        < BR />

    < /富:面板>
 

解决方案

在其他的形式,其中你的表更新的显示形式,请确保您有形式的AJAX客户端ID 渲染。否则,更新的形式将失去其视图状态,因此什么都不会在1日处理提交。 1号后提交表格获得其视图状态恢复以及随后的提交将被成功处理。

例如。

< H:形式GT;   ...     < H:的commandButton值=提交行动=#{bean.submit}>         < F:AJAX执行=@形式呈现=:otherPanel:otherForm/>     < / H:的commandButton> < /小时:形式GT; &所述; H:panelGroup中的id =otherPanel>     ...     < H:格式ID =otherForm>         ...     < /小时:形式GT;     ... < /小时:panelGroup中>

此问题与 JSF规范问题790 并固定为即将到来的JSF 2.2。 PrimeFaces 3.x中没有这个问题,因为它的修改JSF Ajax引擎已经考虑到这一点。

参见:

Communication在JSF2 - 内容的Ajax渲染包含另一种形式

I have a table of users with an a4j:commandLink which deletes the corresponding user, but the problem is that I need to click twice for the action to execute, how can I solve it, here's the code:

            <h:form id="formUsuariosRegistrados">
                <rich:dataScroller for="usersTable" fastControls="hide"
                                   boundaryControls="hide" />
                <rich:dataTable id="usersTable" rows="10" var="user"
                                value="#{administrationBean.tablaUsuarios}">
                    <f:facet name="header">
                        <rich:columnGroup>
                            <rich:column>
                                <h:outputText value="Nombre"/>
                            </rich:column>
                            <rich:column>
                                <h:outputText value="Usuario"/>
                            </rich:column>
                            <rich:column>
                                <h:outputText value="Dependencia"/>
                            </rich:column>
                            <rich:column>
                                <h:outputText value="Email"/>
                            </rich:column>
                            <rich:column>
                                <h:outputText value="Tipo usuario"/>
                            </rich:column>
                            <rich:column>
                                <h:outputText value="Tipo dependencia"/>
                            </rich:column>
                            <rich:column>
                                <h:outputText value="Fecha límite"/>
                            </rich:column>
                            <rich:column>
                                <h:outputText value=""/>
                            </rich:column>
                        </rich:columnGroup>
                    </f:facet>
                    <rich:column>
                        <h:outputText value="#{user.nombre}"/>
                    </rich:column>
                    <rich:column>
                        <h:outputText value="#{user.usuario}"/>
                    </rich:column>
                    <rich:column>
                        <h:outputText value="#{user.dependencia}"/>
                    </rich:column>
                    <rich:column>
                        <h:outputText value="#{user.correo}"/>
                    </rich:column>
                    <rich:column>
                        <h:outputText value="#{user.tipoUsuario}"/>
                    </rich:column>
                    <rich:column>
                        <h:outputText value="#{user.tipoDependencia}"/>
                    </rich:column>
                    <rich:column>
                        <h:outputText value="#{user.fechaLimiteCarga}"/>
                    </rich:column>
                    <rich:column>
                        <a4j:commandLink value="Eliminar" immediate="true"
                                         execute="@form"
                                         onclick="return confirm('Esta seguro(a) que deseea continuar?')"
                                         render="@form :formFechaLimite :formModificarContrasena"
                                         action="#{administrationBean.doEliminarUsuario(user.usuario)}"/>
                    </rich:column>
                </rich:dataTable>
            </h:form>

UPDATE

Here's another piece of code that I added to the same view, but now happen two things:

When View is first loaded, if I click on the a4j:commandLink on the table, the action gets called fine. After doing 1, when I try to check (or uncheck) the <h:sekectBooleanCheckBox> now this component executes ajax after clicking twice.

I tried what BalusC's answers says but I think I am not doing it right with this new form.

Please advise, cheers

    <h:form id="formFechaLimite">
        <rich:panel style="width: 400px" id="panelFechaLimite">
            <f:facet name="header">
                <h:outputText value="Fecha limite de carga"/>
            </f:facet>

            <h:outputLabel for="fechaLimite" value="Fecha Limite"/>
            <br/>
            <rich:calendar id="fechaLimite"
                           value="#{administrationBean.fechaLimite}"
                           datePattern="dd/MM/yyyy">
                <a4j:ajax event="change" render="usuarios fechaLimiteModificada"
                          listener="#{administrationBean.doHideEtiquetaFechaModificada}"/>
            </rich:calendar>
            <br/>
            <h:outputLabel for="todosUsuarios"
                           value="Aplicar a todos los usuarios? "/>
            <h:selectBooleanCheckbox id="todosUsuarios"
                                     value="#{administrationBean.fechaTodosUsuarios}">
                <a4j:ajax event="change" render="usuarios fechaLimiteModificada"
                          listener="#{administrationBean.doCheckBoxChanged}"/>
            </h:selectBooleanCheckbox>
            <br/>
            <a4j:outputPanel id="usuarios">
                <rich:select value="#{administrationBean.selectedUser}"
                             defaultLabel="Seleccione un usuario..."
                             rendered="#{not administrationBean.fechaTodosUsuarios}">
                    <f:selectItems value="#{administrationBean.selectUser}"/>
                    <a4j:ajax event="selectitem" render="fechaLimiteModificada"
                              listener="#{administrationBean.doHideEtiquetaFechaModificada}"/>
                </rich:select>
            </a4j:outputPanel>
            <br/><br/>
            <a4j:commandButton value=" Aplicar " execute="@form"
                               render="@form :panelUsuarios :formUsuariosRegistrados :usersTable"
                               action="#{administrationBean.doCambiarFechaLimite}"/>
            <a4j:outputPanel id="fechaLimiteModificada">
                <h:outputText value="Fecha límite modificada !"
                              rendered="#{administrationBean.renderedEtiquetaFechaModicada}"
                              style="color: #D17100; font-size: 14px;"/>
            </a4j:outputPanel>
        </rich:panel>
        <br/>
    </h:form>

    <br/>

    <rich:panel style="width: 800px" id="panelUsuarios">
        <f:facet name="header">
            <h:outputText value="Administración de usuarios"/>
        </f:facet>
        <h:form id="formUsuariosRegistrados">
            <rich:dataScroller for="usersTable" fastControls="hide"
                               boundaryControls="hide" />
            <rich:dataTable id="usersTable" rows="10" var="user"
                            value="#{administrationBean.tablaUsuarios}">
                <f:facet name="header">
                    <rich:columnGroup>
                        <rich:column>
                            <h:outputText value="Nombre"/>
                        </rich:column>
                        <rich:column>
                            <h:outputText value="Usuario"/>
                        </rich:column>
                        <rich:column>
                            <h:outputText value="Dependencia"/>
                        </rich:column>
                        <rich:column>
                            <h:outputText value="Email"/>
                        </rich:column>
                        <rich:column>
                            <h:outputText value="Tipo usuario"/>
                        </rich:column>
                        <rich:column>
                            <h:outputText value="Tipo dependencia"/>
                        </rich:column>
                        <rich:column>
                            <h:outputText value="Fecha límite"/>
                        </rich:column>
                        <rich:column>
                            <h:outputText value=""/>
                        </rich:column>
                    </rich:columnGroup>
                </f:facet>
                <rich:column>
                    <h:outputText value="#{user.nombre}"/>
                </rich:column>
                <rich:column>
                    <h:outputText value="#{user.usuario}"/>
                </rich:column>
                <rich:column>
                    <h:outputText value="#{user.dependencia}"/>
                </rich:column>
                <rich:column>
                    <h:outputText value="#{user.correo}"/>
                </rich:column>
                <rich:column>
                    <h:outputText value="#{user.tipoUsuario}"/>
                </rich:column>
                <rich:column>
                    <h:outputText value="#{user.tipoDependencia}"/>
                </rich:column>
                <rich:column>
                    <h:outputText value="#{user.fechaLimiteCarga}"/>
                </rich:column>
                <rich:column>
                    <a4j:commandLink value="Eliminar" immediate="true"
                                     execute="@form"
                                     ondblclick="return confirm('Esta seguro(a) que deseea continuar?')"
                                     render="@form :formFechaLimite :formModificarContrasena"
                                     action="#{administrationBean.doEliminarUsuario(user.usuario)}"/>
                </rich:column>
            </rich:dataTable>
        </h:form>

        <br/>

    </rich:panel>

解决方案

In the other form wherein you're updating the shown form with the table, make sure that you include the client ID of the form in the ajax render. Otherwise the updated form will lose its view state and thus nothing will be processed on 1st submit. After the 1st submit the form get its view state back and subsequent submits will be processed successfully.

E.g.

<h:form>
  ...
    <h:commandButton value="Submit" action="#{bean.submit}">
        <f:ajax execute="@form" render=":otherPanel :otherForm" />
    </h:commandButton>
</h:form>

<h:panelGroup id="otherPanel">
    ...
    <h:form id="otherForm">
        ...
    </h:form>
    ...
</h:panelGroup>

This problem is related to JSF spec issue 790 and is fixed for the upcoming JSF 2.2. PrimeFaces 3.x doesn't have this problem as its modified JSF ajax engine has already taken this into account.

See also:

Communication in JSF2 - Ajax rendering of content which contains another form