web-dev-qa-db-ja.com

レンダリング/更新属性のテンプレートで親ネーミングコンテナのIDを取得します

私はテンプレートを持っており、その定義ではいくつかのフォームとボタンを使用しています。

問題は、定義(定義)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のドキュメントには@キーワードのみが記載されています。

17
djmj

醜いですが、これはあなたのためにうまくいくはずです:

_<p:commandButton action="..." update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2" />
_

すでにPrimeFacesを使用しているため、代わりに#{p:component(componentId)}を使用することもできます。このヘルパー関数は、ビュールート全体をスキャンして、指定されたIDのコンポーネントを探し、そのクライアントIDを返します。

_<p:commandButton action="..." update=":#{p:component('table2')}" />
_
51
BalusC

醜い答えはうまくいく

update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2

主に開いたダイアログから親データテーブルへのより便利な更新

1
user2120191

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>
1
Dmitry Trifonov

上記の解決策に加えて、更新されるコンポーネントを動的に生成する必要があるという問題がありました(多く)サーバー側のロジックに基づく(ネストを見つけるのが難しい場合があります)。

したがって、サーバー側のソリューションは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')}( ":"の代わりに "。")を書くことを提案しましたが、これは役に立ちませんでした-もちろん。

0

これを試して:

<h:commandButton value="Click me">
    <f:ajax event="click" render="table" />
</h:commandButton>
0