<a4j:commandbutton>仅在第二次单击时调用action

Har*_*hah 12 jsf richfaces ajax4jsf jsf-2

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 24

此问题称为JSF规范问题790.如果你ajax渲染一些反过来包含a的内容<h:form>,那么它的视图状态就会丢失,这导致该表单中的第一个动作不会调用任何东西.在第一个动作的ajax响应中,表单将获得新的视图状态,因此任何后续动作都将成功.

计划在即将推出的JSF 2.2中修复.但是现在使用JSF 2.0/2.1,您必须引入一种解决方法.您首先需要提供<h:form>一个固定的ID,yourFormId如下例所示:

<h:panelGrid id="addToThisDepartmentPanel">
    ...
    <h:form id="yourFormId">
        ...
Run Code Online (Sandbox Code Playgroud)

然后你需要在render属性中引用它:

<f:ajax ... render=":addToThisDepartmentPanel :yourFormId" />
Run Code Online (Sandbox Code Playgroud)

同样的故事也适用于<a4j:xxx>组件.

<a4j:commandButton ... render=":addToThisDepartmentPanel :yourFormId" />
Run Code Online (Sandbox Code Playgroud)

也可以看看: