1

2 つのフォームで構成される単純なページがあります。それらを同時に表示することはできません (一方が他方を切り替えます)。コードは次のとおりです。

<h:body>

    <ui:composition template="/elements/templateWithMenu.xhtml">            
        <ui:define name="content">

            <p:dialog id="question1DialogId" widgetVar="question1Dialog" resizable="false" closable="false" visible="true">                             

                <h:panelGroup id="questionStep1Group">
                    <h:form id="questionStep1Form" rendered="#{newPoll2.displayQuestionStep1}">

                        <h:commandLink value="next" action="#{newPoll2.questionStep1Completed()}" class="btn" >
                            <f:ajax execute="@form" render=":questionStep2Form :questionStep1Group :questionStep2Group"/>
                        </h:commandLink>

                    </h:form>
                </h:panelGroup>

                <h:panelGroup id="questionStep2Group">
                    <h:form id="questionStep2Form"  rendered="#{newPoll2.displayQuestionStep2}">

                        <h:commandLink value="cancel" action="#{newPoll2.questionStep2Cancelled()}" class="btn" >
                            <f:ajax execute="@form" render=":questionStep1Form :questionStep1Group :questionStep2Group" />
                        </h:commandLink>

                    </h:form>
                </h:panelGroup>

            </p:dialog>

        </ui:define>
    </ui:composition>

</h:body>

questionStep1Completed()questionStep2Cancelled()は、 rendered属性で使用されるブール値を切り替えるだけです。

問題はビューステートにあります。ページが最初に読み込まれると、[次へ] をクリックしても機能し、[キャンセル] リンクに置き換えられます。しかし、「キャンセル」リンクをクリックすると、「次へ」リンクに置き換えるために 2 回クリックする必要があります。最初のクリックでビュー ステートなしのリクエストが行われ、2 回目の (成功した) クリックでリクエストが行われたことがわかります。

この質問とこのリンクを見ました。ご覧のとおり、 render属性にフォーム ID を追加しましたが、まだ機能しません。何か案は?

ありがとう

4

1 に答える 1

2

フォーム自体を条件付きでレンダリングしているため、ajax リクエストが準備された時点では、HTML DOM ツリーで他のフォームを物理的に使用できません。フォームのコンテンツを別のコンテンツでラップし、属性をそこに<h:panelGroup>移動すると、機能するはずです。rendered

于 2012-06-23T00:14:20.573 に答える