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

Posted

技术标签:

【中文标题】<a4j:commandbutton> 操作仅在第二次单击时调用【英文标题】:<a4j:commandbutton> action is only invoked on second click 【发布时间】:2012-04-23 02:09:04 【问题描述】:

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

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

问题是第二次点击我的&lt;a4j:commandButton&gt; 动作被调用。但它不会在第一次点击时被调用。 有什么想法吗?

【问题讨论】:

为了排除一个和另一个,&lt;h:panelGrid&gt; 是否事先被另一种 ajax 表单重新渲染? 嗯,我可以假设答案是“是”吗?如果不是这样,我不想浪费时间写答案。 BalusC 帮助...我是 JSF 新手 对我第一条评论中的问题回答“是”或“否”即可。 是的 被另一个 ajax 重新渲染.. 【参考方案1】:

这个问题被称为JSF spec issue 790。如果您对某些内容进行 ajax 渲染,而这些内容又包含 &lt;h:form&gt;,则其视图状态将丢失,这将导致该表单内的第一个操作不会调用任何内容。在第一个动作的 ajax 响应中,表单将获得新的视图状态,因此任何后续动作都会成功。

计划在即将到来的 JSF 2.2 中修复此问题。但是现在使用 JSF 2.0/2.1,您必须引入一种解决方法。你首先需要给&lt;h:form&gt;一个固定的ID,在下面的例子中是yourFormId

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

那么你还需要在render属性中引用它:

<f:ajax ... render=":addToThisDepartmentPanel :yourFormId" />

同样的情况也适用于&lt;a4j:xxx&gt; 组件。

<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

【讨论】:

render属性值中是否需要冒号? 由于某种原因这对我不起作用

以上是关于<a4j:commandbutton> 操作仅在第二次单击时调用的主要内容,如果未能解决你的问题,请参考以下文章

标签 <q>、<abbr>、<defn>、<ins>、<del> 和 <s> 的正确用法是啥? [关闭]

<em> 中的 <strong> 或 <strong> 中的 <em> 重要吗?

将 Single<List<Maybe<Book>>> 转换为 Single<List<Book>>

根据键将 List<List<List<T>>> 转换为 List<List<T>>

LL文法

前端初步预习