jsf - <a4j :commandbutton> action is only invoked on second click

标签 jsf jsf-2 richfaces ajax4jsf

我想在单击按钮时提交数据表,但在第一次单击时不会调用该操作。这是我的代码:

<h:panelGrid id="addToThisDepartmentPanel">
    <h:outputText value="#{messageDataBean.message}" rendered="#{messageDataBean.isSuccess eq false}" style="color:red" id="addToThisDepartmentMessage"/>
    <h:form>
        <h:dataTable value="#{systemResultViewUtil.systemUserDetailDataBeansList}" var="departmentdetail" id="addToThisDepartmentDataTable" rendered="#{systemResultViewUtil.systemUserDetailDataBeansList.size() gt 0}">
            <h:column>
               <f:facet name="header">
                   Name
               </f:facet>
               <h:outputText value="#{departmentdetail.name}" style="text-align: left;padding-right: 120px" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    Current Department
                </f:facet>
                <h:outputText value="#{departmentdetail.depName}" style="text-align: left;padding-right: 120px" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    Add To This
                </f:facet>
                <h:selectBooleanCheckbox value="#{departmentdetail.cheked}" style="text-align: left;padding-right: 120px"/>
            </h:column>
         </h:dataTable>

         <a4j:commandButton oncomplete="if(#{messageDataBean.isSuccess eq true}){ closeAddToThisDepartmentDialog()}" value="Add TO This Department" action="#{departmentServiceBean.addEmployeeToThisDepartment}" id="addToThisDepartmentButton"
                                                       render=":addToThisDepartmentMessage :message" execute=":addToThisDepartmentDataTable" />
     </h:form>
</h:panelGrid>

问题是第二次点击我的<a4j:commandButton> Action 被调用。但它不会在第一次点击时被调用。
有任何想法吗?

最佳答案

此问题称为 JSF spec issue 790 .如果您对某些内容进行 ajax 渲染,这些内容又包含 <h:form> ,那么它的 View 状态将丢失,这导致该表单内的第一个操作不会调用任何东西。在第一个 Action 的 ajax 响应中,表单将获得新的 View 状态,因此任何后续 Action 都会成功。

这计划在即将到来的 JSF 2.2 中修复。但是现在使用 JSF 2.0/2.1,您必须引入一种解决方法。您首先需要提供 <h:form>固定 ID,即 yourFormId在下面的例子中:

<h:panelGrid id="addToThisDepartmentPanel">
    ...
    <h:form id="yourFormId">
        ...

然后你需要在render中引用它属性也是:
<f:ajax ... render=":addToThisDepartmentPanel :yourFormId" />

同样的故事也适用于 <a4j:xxx>组件。
<a4j:commandButton ... render=":addToThisDepartmentPanel :yourFormId" />

也可以看看:
  • h:commandButton/h:commandLink does not work on first click, works only on second click
  • Communication in JSF 2.0 - Ajax rendering of content which contains another form
  • 关于jsf - <a4j :commandbutton> action is only invoked on second click,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10094615/

    相关文章:

    javascript - Primefaces 性能问题

    java - JSF selectOneMenu : validation of two dropdown menus

    richfaces - JSF1.2 - richFaces progressBar - 简单的演示不工作

    jsf - Primefaces p :fileupload component problem

    forms - 如何在 <ui :repeat var> in id attribute of a JSF component 中使用 EL

    javascript - 获取 p :selectOneMenu in JavaScript 的选定值

    jsf-2 - JSF 2 中的范围

    java - 如何将主面自动完成对象放入支持 bean 中

    java - 从 rich :datatable binding table 获取行

    richfaces - 在 <rich :extendedDataTable> 中禁用列大小调整