JSFバッキングBeanメソッドからJSFコンポーネントを更新できますか?


100

JSFバッキングBeanにページ上のコンポーネントの更新を引き起こす方法はありますか?ページ上のコンポーネントを更新するためにupdate属性を持つajaxコンポーネントを使用するつもりはありません。JSFバッキングBeanメソッド内から更新をトリガーする必要があります。このメソッドが完了した後、またはその完了前に、ページの更新が発生する可能性があることに注意してください。PrimeFacesを使用して得られる解決策がある場合は、PrimeFacesを使用しています。


検証エラーをトリガーできます:stackoverflow.com/a/14401741/1599699
Andrew

回答:


183

標準のJSF APIを使用して、クライアントIDをに追加しますPartialViewContext#getRenderIds()

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

PrimeFaces固有のAPIを使用するには、を使用しますPrimeFaces.Ajax#update()

PrimeFaces.current().ajax().update("foo:bar");

または、PrimeFaces 6.2以降を使用していない場合は、を使用してくださいRequestContext#update()

RequestContext.getCurrentInstance().update("foo:bar");

JSFユーティリティライブラリOmniFacesを使用する場合は、を使用してくださいAjax#update()

Ajax.update("foo:bar");

方法に関係なく、これらのクライアントIDは、ビュー側から行う場合のように、区切り文字が前に付いていない絶対クライアントIDを表す必要があることに注意しNamingContainerてください。


6
応答のレンダリングフェーズでこれを機能させることができないようです(残念ながら、このコードを配置する必要があります)。アプリケーションの起動またはそれ以前のフェーズに配置した場合、問題はありません。応答のレンダリングフェーズにするための回避策はありますか?
BestPractices 2012

8
いいえ、遅すぎます。ジョブを移動して、アクションフェーズを呼び出すか、応答レンダリングフェーズの前に移動します。<f:ajax listener>またはでメソッドを呼び出す<f:event type="preRenderView" listener>
BalusC

JSF 1.2でそれを行う方法についてのアイデアはありますか?答えが長すぎる/複雑すぎる場合は、新しい質問をすることができます。
RinaldoPJr

@RinaldoPJr:JSF 1.2にはの概念がありません<f:ajax>。これはJSF 2.0から導入されました。JSF 1.2コンポーネントライブラリ固有の機能に頼る必要があります。
BalusC

@DanielK:わからない。トリニダードはしません。それでもトリニダードの方法がわからない場合は、標準のJSF APIアプローチを使用してください。
BalusC 2015年

9

私はまた、JSFバッキングBean /クラスからコンポーネントを更新しようとしました

UIコンポーネントを操作した後、次のことを行う必要があります。

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

(サーバー側の)componentIdではなくclientIdを使用することが重要です!!


7

RequestContextされる非推奨からPrimefaces 6.2。このバージョンから、以下を使用します。

if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
    PrimeFaces.current().ajax().update(componentID);
}

そして、バックビーンからjavascriptを実行するには、次のようにします。

PrimeFaces.current().executeScript(jsCommand);

参照:


1

研究するのに十分な時間がある場合にのみ、すべてが可能です:)

私がしなければならないのは、ui:repeatに反復して、入力の名前とその他のフィールドを表示する人を作るようなものです。しかし、フィールドの1つはsingleSelect-Aであり、その値に応じて別の入力を更新します-B. ui:repeatでも、idがなく、DOMツリーに表示されました

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

HTMLのIDは次のようなものでした。

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

ビューでは、次のような1つのメソッドを取得しました。

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

そしてその実装は次のような豆でした:

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

したがって、この方法でBeanから要素を問題なく更新しました。PFバージョン6.2

幸運と幸せなコーディング:)


にajax変更イベントがある場合personType、人とインデックスの両方をajaxリスナーに渡すことは不必要です。イベントからIDと値の両方を取得できます。しかし、あなたの解決策はあなたの特定のユースケースに必要なものかもしれませんが、完全な例がないので(最小限の再現可能な例のフレーバー)、それを伝えるのは困難です。
Kukeltje
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.