我想在按钮单击时提交数据表,但第一次单击时不会调用该操作。这是我的代码:
<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>
操作被调用。但是第一次点击时不会调用它
有什么想法吗?
答案 0 :(得分:24)
此问题称为JSF spec issue 790。如果你ajax渲染一些反过来包含<h:form>
的内容,那么它的视图状态将会丢失,这导致该表单中的第一个动作不会调用任何内容。在第一个动作的ajax响应中,表单将获得新的视图状态,因此任何后续动作都将成功。
计划在即将推出的JSF 2.2中修复。但是现在使用JSF 2.0 / 2.1,您必须引入一种解决方法。您首先需要在下面的示例中为<h:form>
提供yourFormId
的固定ID:
<h:panelGrid id="addToThisDepartmentPanel">
...
<h:form id="yourFormId">
...
然后您还需要在render
属性中引用它:
<f:ajax ... render=":addToThisDepartmentPanel :yourFormId" />
同样的故事适用于<a4j:xxx>
组件。
<a4j:commandButton ... render=":addToThisDepartmentPanel :yourFormId" />