13

ボタンクリックでデータテーブルを送信したいのですが、最初のクリックでそのアクションが呼び出されません。これが私のコードです:

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

問題は、2回目のクリックで私の<a4j:commandButton>アクションが呼び出されることです。ただし、最初のクリックでは呼び出されません。
何か案は?

4

1 に答える 1

26

この問題は、JSF仕様の問題790として知られています。を含むコンテンツをajax-render<h:form>すると、そのビューステートが失われるため、そのフォーム内の最初のアクションは何も呼び出されません。最初のアクションのajax応答で、フォームは新しいビューステートを取得するため、後続のアクションはすべて成功します。

これは、次のJSF2.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" />

参照:

于 2012-04-10T19:30:58.053 に答える