4

私はinputTextを持っています:

<h:inputText id="result" value="#{guessNumber.result}"/>

および別の入力テキスト:

<h:inputText id="name" value="#{guessNumber.named}" onchange="submit()" valueChangeListener="#{guessNumber.processValueChange}"/>

そして、processValueChange メソッド内に、次の行を追加しました。

result = "hello";

しかし、「結果」inputText の表示値はチェーンされていないままです。何が問題なのでしょうか?

4

2 に答える 2

10

このvalueChangeListener方法は、この方法でモデルに変更を加えることを目的としたものではありません。古いモデル値と新しいモデル値の両方を手にした瞬間に、モデル値の実際の変化を聞くことを目的としています。たとえば、ロギングを実行します。検証フェーズの最後、モデル値の更新フェーズの直前に実行されます。したがって、リスナーメソッド内で自分でモデル値に加えた変更は、モデル値の更新フェーズ中に上書きされます。

<f:ajax listener>代わりに必要です。これは、モデル値の更新フェーズの後の呼び出しアクションフェーズ中に実行されます。

<h:outputText id="result" value="#{guessNumber.result}" />
<h:inputText id="name" value="#{guessNumber.named}">
    <f:ajax listener="#{guessNumber.namedChanged}" render="result" />
</h:inputText>

onchange="submit()"( JavaScriptハンドラーを削除したことに注意してください!)

public void namedChanged(AjaxBehaviorEvent event) {
    result = "Hello, you entered " + named;
}

(引数はオプションです。不要な場合は省略してください)

参照:

于 2012-09-28T19:01:39.323 に答える
3

私は解決策を見つけました: inputText のvalue属性を Bean 内の String プロパティ (結果) にバインドする代わりに、inputText を Bean 内の UIInput プロパティにバインドしました。

<h:inputText id="result" binding="#{guessNumber.result}"/>

そして豆の中:

private UIInput result = null;

これにより、リスナー メソッドは、inputTextのvalue属性にバインドされているプロパティを変更する代わりに、inputText値を直接変更できます。

result.setValue("Hello");

私の問題を解決しようとしたすべての人に感謝します。

于 2012-09-29T09:11:48.980 に答える