问题描述
我想在单击按钮时提交数据表,但是第一次单击时不会调用该操作.这是我的代码:
I want to submit a data table on a button click, but that action is not called on the first click. Here is my code:
<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>
动作.但第一次点击时不会调用它.
有什么想法吗?
The problem is that on the second click my <a4j:commandButton>
action is called. But it is not called on the first click.
Any ideas?
推荐答案
此问题称为 JSF规范第790期.如果您ajax渲染某些内容,而这些内容又包含一个<h:form>
,则其视图状态将丢失,这将导致该表单内的第一个操作不会调用任何内容.在第一个动作的ajax响应上,表单将获得新的视图状态,因此任何后续动作都将成功.
This problem is known as JSF spec issue 790. If you ajax-render some content which in turn contains a <h:form>
, then its view state will get lost, which causes that the 1st action inside that form won't invoke anything. On the ajax response of the first action, the form will get new view state and thus any subsequent actions will succeed.
此问题计划在即将发布的JSF 2.2中修复.但是现在使用JSF 2.0/2.1,您必须引入一种解决方法.在下面的示例中,您首先需要给<h:form>
一个固定的ID,该ID为yourFormId
:
This is scheduled to be fixed for the upcoming JSF 2.2. But right now with JSF 2.0/2.1 you have to introduce a workaround. You first need to give the <h:form>
a fixed ID which is yourFormId
in the below example:
<h:panelGrid id="addToThisDepartmentPanel">
...
<h:form id="yourFormId">
...
然后,您还需要在render
属性中引用它:
Then you need to reference it in the render
attribute as well:
<f:ajax ... render=":addToThisDepartmentPanel :yourFormId" />
同一故事适用于<a4j:xxx>
组件.
<a4j:commandButton ... render=":addToThisDepartmentPanel :yourFormId" />
另请参见:
- h:commandButton/h:commandLink不适用于第一次单击,仅适用第二次点击
- JSF 2.0中的通信-内容的Ajax呈现其中包含另一种形式
- 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
See also:
这篇关于< a4j:commandbutton>仅在第二次单击时调用操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!