私はテンプレートを持っており、その定義ではいくつかのフォームとボタンを使用しています。
問題は、定義(定義)xhtmlファイルがコンポーネント階層を認識していないことです。
たとえば、同じ定義ファイル内の別の形式で要素「table2」を更新したいとします。
テンプレート挿入:
<p:tabView id="nav"> <!-- nav -->
<ui:insert name="content_nav">content navigation</ui:insert>
</p:tabView>
私の階層「nav」の最初のレベルを定義します
テンプレート定義:
<ui:define name="content_nav">
<h:form id="form1"> <!-- nav:form1 -->
<h:dataTable id="table1"/> <!-- nav:form1:table1 -->
<p:inputText value="#{bean.value}"/>
<p:commandButton action="..." update="nav:form2:table2"/>
</h:form>
<h:form id="form2">
<h:dataTable id="table2"/> <!-- nav:form2:table2 -->
<!-- other elements -->
</h:form>
</ui:define>
私の定義部分では、「nav」を知りたくありません!
これどうやってするの?または、1つの名前付けコンポーネントを上に移動する方法、または親の最も高い完全なIDを変数に保存する方法を教えてください。
時々私は次のようなものを見ました:
update=":table2"
しかし、これに関する情報は見つかりませんでしたか?、JavaEE6のドキュメントには@キーワードのみが記載されています。
醜いですが、これはあなたのためにうまくいくはずです:
_<p:commandButton action="..." update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2" />
_
すでにPrimeFacesを使用しているため、代わりに#{p:component(componentId)}
を使用することもできます。このヘルパー関数は、ビュールート全体をスキャンして、指定されたIDのコンポーネントを探し、そのクライアントIDを返します。
_<p:commandButton action="..." update=":#{p:component('table2')}" />
_
醜い答えはうまくいく
update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2
主に開いたダイアログから親データテーブルへのより便利な更新
binding
属性を使用して、JSFコンポーネントにバインドされたEL変数を宣言できます。次に、javax.faces.component.UIComponent.getClientId()
を使用して、このコンポーネントの絶対クライアントIDにアクセスできます。以下の例を参照してください。
<t:selectOneRadio
id="yourId"
layout="spread"
value="#{yourBean.value}"
binding="#{yourIdComponent}">
<f:selectItems value="#{someBean.values}" />
</t:selectOneRadio>
<h:outputText>
<t:radio for=":#{yourIdComponent.clientId}" index="0" />
</h:outputText>
上記の解決策に加えて、更新されるコンポーネントを動的に生成する必要があるという問題がありました(多く)サーバー側のロジックに基づく(ネストを見つけるのが難しい場合があります)。
したがって、サーバー側のソリューションはupdate=":#{p:component('table2')}"
と同等です。1org.primefaces.util.ComponentUtils.findComponentClientId( String designId )
を使用します:
_// UiPnlSubId is an enum containing all the ids used within the webapp xhtml.
// It could easily be substituted by a string list or similar.
public static String getCompListSpaced( List< UiPnlSubId > compIds ) {
if ( compIds == null || compIds.isEmpty() )
return "" ;
StringBuffer sb = new StringBuffer( ":" ) ;
for ( UiPnlSubId cid : compIds )
sb.append( ComponentUtils.findComponentClientId( cid.name() ) ).append( " " ) ;
return sb.deleteCharAt( sb.length() - 1 ).toString() ; // delete suffixed space
}
_
それを使用する他のメソッドを介して呼び出されます。 ... update="#{foo.getCompListComputed( 'triggeringCompId' )}"
のように。
1:最初に、public static String getCompListSpaced0() { return ":#{p:component('table2')}" ; }
式で... update="#{foo.getCompListSpaced0()}
を返すことをあまり考えずに試しましたが、もちろん(フレームワークがどのように機能するかを考えた後:))解決されません(そのまま返されます)一部のユーザーが経験した問題を引き起こす可能性があります。また、私のEclipse/JBoss Tools環境は、:#{p.component('table2')}
( ":"の代わりに "。")を書くことを提案しましたが、これは役に立ちませんでした-もちろん。
これを試して:
<h:commandButton value="Click me">
<f:ajax event="click" render="table" />
</h:commandButton>