JSFコンポーネントではないページの一部を更新することは可能ですか?
たとえば、プレーンHTMLを更新できます<div>
か、それともJSFコンポーネントでラップする必要がありますか?
JSFコンポーネントではないページの一部を更新することは可能ですか?
いいえ。更新されるコンポーネントは、によって利用可能である必要がありますUIViewRoot#findComponent()
。これにより、JSFはコンポーネントを見つけて呼び出しencodeAll()
、生成されたHTML出力をキャプチャして、JavaScriptがHTMLDOMツリーを更新できるようにajax応答に返します。 。UIComponent
プレーンなHTML要素はJSFコンポーネントツリーでは実際のインスタンスとして表されないため、JSFはそれらを最初から見つけることができません。
たとえば、プレーンHTMLを更新できます
<div>
か、それともJSFコンポーネントでラップする必要がありますか?
のようなJSFコンポーネントでラップする必要があります<h:panelGroup>
。ただし、JSF<h:panelGroup layout="block">
で実数を表すために使用することもできます。このように、別のJSFコンポーネントで<div>
ラップする必要はありません。<div>
<h:panelGroup layout="block" id="foo">
...
</h:panelGroup>
JSF 2.2以降では、属性を持つ新しいパススルー要素機能を使用jsf:id
して、HTML(5)要素をJSFコンポーネントとして宣言できます。
<... xmlns:jsf="http://xmlns.jcp.org/jsf">
<div jsf:id="foo">
...
</div>
<main jsf:id="bar">
...
</main>
<section jsf:id="baz">
...
</section>
それらは出力をそのままレンダリングしますが、カバーの下には具体的なUIPanel
インスタンスがあります。
ただし、複合コンポーネントの場合は1つのコーナーケースがあります。次のアプローチを使用して、 ajaxで更新可能なHTML要素を作成できます。
<cc:implementation>
<span id="#{cc.clientId}">
...
</span>
</cc:implementation>
このアプローチが機能するという説明は、複合コンポーネントがそれ自体をHTML出力にレンダリングしない場合でも、それ自体がによって利用可能であるためですUIViewRoot#findComponent()
。
できないようです。
何かを更新するには、それを「更新可能な」コンポーネント(primeaces p:outputpanel内)にラップして、それを更新します。
追加:特別な場合には、p:treeの子を次のように更新できます:JSFはprimefacesツリーの子を更新します
(笑はいつも第三者で私と話したいと思っていました)
AFAIKは、コンポーネントをIDで更新します。通常の要素は、IDを持つことができるため、IDを正しく取得している限り可能であるはずです;-)