0

これは、ページ コンポーネントの条件付きレンダリングに関する以前の投稿の更新です。f:ajax タグを使用して、選択したユーザー入力に基づいて、ページ上のさまざまなコンポーネントを条件付きでレンダリングできるようになりました。問題は、コマンドボタンをクリックすると、ajax を使用して条件付きでレンダリングされた入力が送信時に読み取られないことです。新しいコンポーネントを追加してもページ全体が再レンダリングされず、送信ボタンが表示されないためだと思います。これが私のフォームページのセグメントです(ah:formタグでラップされています):

            <h:outputLabel for="selectPersonType" value="Select Type: "/>
            <h:selectOneMenu id="selectPersonType" value="#{addPersonBean.personType}" label="Person Type" required="true">
                <f:selectItem itemValue=""/>
                <f:selectItems value="#{listBean.personTypes}" />
                <f:ajax render="results"/>
            </h:selectOneMenu>
            <h:message for="selectPersonType" style="color: red"/>
        </h:panelGrid>

        <h:panelGroup id="results">
            
            <h:panelGroup rendered="#{addPersonBean.personType == 'STUDENT'}">
                <h:outputLabel for="selectSchoolType" value="School Type: " />
                <h:selectOneMenu id="selectSchoolType" value="#{addPersonBean.schoolType}">
                    <f:selectItems value="#{listBean.schoolTypes}" />
                    <f:ajax execute="selectSchoolType"/>
                </h:selectOneMenu>
            </h:panelGroup>
            
            <h:panelGroup rendered="#{addPersonBean.personType == 'PATIENT'}">
                <h:outputLabel for="smoker" value="Smoker? " />
                <h:selectBooleanCheckbox id="smoker" value="#{addPersonBean.smoker}">
                    <f:ajax execute="smoker"/>
                </h:selectBooleanCheckbox>
  
            </h:panelGroup>
        </h:panelGroup>

        <h:commandButton value="Add Person" action="#{addPersonBean.action}"/>

ここでの問題は、ID が 'selectSchoolType' および 'smoker's values のコンポーネントは、ページが読み込まれた後に selectPersonType 選択メニューを使用して条件付きでレンダリングされるため、commandButton をクリックしても設定されないことです。送信ボタンをクリックするのではなく、値が変更されたときにコンポーネントを起動する方法はありますか (したがって、送信をクリックする前に値を処理する必要があります)。ご覧のとおり、問題のコンポーネントに execute 属性を付けて f:ajax を使用しようとしましたが、うまくいかなかったようです。(これらのコンポーネントのデフォルトのイベントは valueChange だと思うので、f:ajax タグには追加していませんが、'change' と 'valueChange' を試しました)。

4

1 に答える 1

1

すべての<f:ajax>ものは、条件付きでレンダリングされたコンポーネント内にあります。フォーム送信の処理中にrendered属性の背後にある条件が評価されると、この構成は失敗します。falseこれ#{addPersonBean}は、 がリクエスト スコープ内にあり、(後) 構築中に属性の背後にある条件を事前に初期化していないrendered場合、または getter/setter でビジネス ロジックを間違った方法で実行している場合に発生します。

をビュー スコープに配置し#{addPersonBean}、ゲッター/セッターでビジネス ロジックを実行していないことを確認すると、この問題が解決するはずです。

以下も参照してください。

于 2012-11-28T12:58:09.033 に答える