JSFバッキングBeanにページ上のコンポーネントの更新を引き起こす方法はありますか?ページ上のコンポーネントを更新するためにupdate属性を持つajaxコンポーネントを使用するつもりはありません。JSFバッキングBeanメソッド内から更新をトリガーする必要があります。このメソッドが完了した後、またはその完了前に、ページの更新が発生する可能性があることに注意してください。PrimeFacesを使用して得られる解決策がある場合は、PrimeFacesを使用しています。
JSFバッキングBeanにページ上のコンポーネントの更新を引き起こす方法はありますか?ページ上のコンポーネントを更新するためにupdate属性を持つajaxコンポーネントを使用するつもりはありません。JSFバッキングBeanメソッド内から更新をトリガーする必要があります。このメソッドが完了した後、またはその完了前に、ページの更新が発生する可能性があることに注意してください。PrimeFacesを使用して得られる解決策がある場合は、PrimeFacesを使用しています。
回答:
標準の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
てください。
<f:ajax listener>
またはでメソッドを呼び出す<f:event type="preRenderView" listener>
<f:ajax>
。これはJSF 2.0から導入されました。JSF 1.2コンポーネントライブラリ固有の機能に頼る必要があります。
私はまた、JSFバッキングBean /クラスからコンポーネントを更新しようとしました
UIコンポーネントを操作した後、次のことを行う必要があります。
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())
(サーバー側の)componentIdではなくclientIdを使用することが重要です!!
RequestContext
される非推奨からPrimefaces 6.2。このバージョンから、以下を使用します。
if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
PrimeFaces.current().ajax().update(componentID);
}
そして、バックビーンからjavascriptを実行するには、次のようにします。
PrimeFaces.current().executeScript(jsCommand);
研究するのに十分な時間がある場合にのみ、すべてが可能です:)
私がしなければならないのは、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
幸運と幸せなコーディング:)
personType
、人とインデックスの両方をajaxリスナーに渡すことは不必要です。イベントからIDと値の両方を取得できます。しかし、あなたの解決策はあなたの特定のユースケースに必要なものかもしれませんが、完全な例がないので(最小限の再現可能な例のフレーバー)、それを伝えるのは困難です。