3
<h:selectOneMenu id="selectOneMenu"  value="#{Bean1.val1}" >
    <f:selectItems value="#{Bean1.selectItems}"/>
    <a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="textbox1 , textbox2 , textbox3, textbox4"  />
 </h:selectOneMenu>

<h:inputText id="textbox1" value="#{Bean1.textbox1}"> </h:inputText>
<h:inputText id="textbox2" value="#{Bean1.textbox2}"> </h:inputText>
<h:inputText id="textbox3" value="#{Bean1.textbox3}"> </h:inputText>
<h:inputText id="textbox4" value="#{Bean1.textbox4}"> </h:inputText>

Bean1.onSelectOneMenuChange()Bean1.textbox1、、、およびの値Bean1.textbox2を変更します(選択した値に応じて)。すべてのテキストボックス値を変更する場合もあれば、一部のテキストボックス値のみを変更する場合もあります。Bean1.textbox3Bean1.textbox4(Bean1.val1)

ユーザーが「selectOneMenu」ドロップダウンリストコントロールの値を変更すると、JSFフレームワークはモデル値の更新フェーズを呼び出さず、Bean1.onSelectOneMenuChange()直接呼び出します。その後、すべてのテキストボックスがreRenderになります。モデル値の更新フェーズが呼び出されないため、ユーザーが入力した値にBean1が設定されることはなく、元の値がの後にテキストボックスに表示されreRenderます。

聞きたい:

  1. 内部のモデル値の更新フェーズを手動で呼び出すにはどうすればよいBean1.onSelectOneMenuChange()ですか?内部のユーザーが入力した値を取得しBean1.onSelectOneMenuChange()て、の対応するフィールドに設定するにはどうすればよいBean1ですか?

  2. もう1つのアプローチは、Bean1.onSelectOneMenuChange()内で値が更新されるテキストボックスのみを再レンダリングすることです。ただし、多くの場合があります。たとえば、値はすべてのテキストボックス値を変更し、値は一部のテキストボックス値のみを変更する可能性がありreRenderます。条件付きでどうすればよいですか?保守性のためにどの方法がより好まれますか?

アップデート :

ポイント2については、のreRenderプロパティがEL式を受け入れることができることがわかったので、使用してみました

 <a4j:support event="onchange"  action="#{Bean1.onSelectOneMenuChange}" reRender="#{Bean1.reRenderIDList}"  /> .

Bean1.onSelectOneMenuChange()内で、Bean1.reRenderIDListを、ビジネス要件に基づいて再レンダリングする必要のあるIDのセットに設定しました。Bean1.getRenderIDList()ページが更新されたときに実行されます。ただし、<h:selectOneMenu>UIでの値を変更すると、Bean1.getRenderIDList()が再度実行されることはありません。したがって、テキストボックスをreRender

何か案が?

4

1 に答える 1

1

コードは正常に見えます。モデルの更新フェーズが発生しない理由はありません(を使用しませんimmediate=true)。また、会話/検証エラーが発生した場合、アクションは呼び出されません。どのフェーズを通過するかを確認してください。

于 2010-05-13T22:22:29.680 に答える