【问题标题】:a4j:commandLink executes action after double clickinga4j:commandLink 双击后执行动作
【发布时间】:2012-05-29 22:30:58
【问题描述】:

我有一个带有a4j:commandLink的用户表,它删除了相应的用户,但问题是我需要点击两次才能执行该操作,我该如何解决,代码如下:

            <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>

更新

这是我添加到同一个视图中的另一段代码,但现在发生了两件事:

  1. 当第一次加载视图时,如果我点击桌子上的a4j:commandLink,动作就会被调用。

  2. 在执行 1 之后,当我尝试选中(或取消选中)&lt;h:sekectBooleanCheckBox&gt; 时,现在该组件在单击两次后执行 ajax。

  3. 我尝试了 BalusC 的回答,但我认为我用这种新形式做得不对。

    请指教,干杯

        <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>
    

【问题讨论】:

  • 表单或其父表单是否已被另一个表单的 ajax 请求重新渲染/更新?
  • 是的,我有另一个注册用户的表单,每次注册新用户时都会刷新此表。我的做法是不好的做法吗?或者我怎样才能避免双击?我读过一些关于 JSF 2.1 上的错误的信息,可能是那个错误吗?
  • 更新我的问题。我遗漏了一些东西......我输入了父 ID,但仍然没有得到我想要的行为,我非常沮丧!有没有办法查看某些 View 的状态如何,或者可以立即帮助我检测我在 render 属性上缺少的 ID?
  • 这是一个不同的问题。复选框(和单选按钮)始终仅在第二次单击时更改。在第一次单击时,没有任何改变的方法。您需要将 &lt;h:selectBooleanCheckbox&gt; 中的 event="change" 替换为 event="click" 或完全删除它。它已经默认为正确的事件。以后请提出新问题,而不是重复使用旧问题。
  • 谢谢@BalusC 我会检查的。我认为它与相同的问题有关,所以我发布了这个。我会记住这一点。谢谢!

标签: java ajax jsf richfaces


【解决方案1】:

在您使用表格更新显示的表单的另一个表单中,请确保在 ajax render 中包含表单的客户端 ID。否则更新后的表单将失去其视图状态,因此在第一次提交时不会处理任何内容。第一次提交后,表单恢复其视图状态,后续提交将被成功处理。

例如

<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>

这个问题与JSF spec issue 790 相关,并在即将推出的 JSF 2.2 中得到修复。 PrimeFaces 3.x 没有这个问题,因为它修改后的 JSF ajax 引擎已经考虑到了这一点。

另见:

【讨论】:

  • 感谢@BalusC 总是有很大的帮助。顺便说一句,OmniFaces 祝你好运!
猜你喜欢
  • 2011-02-03
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2012-12-07
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多