2012-01-13 5 views
16

私はテンプレートを持っており、その定義ではいくつかのフォームとボタンを使用しています。レンダリング/更新属性のテンプレートの親命名コンテナの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> 

をナビ "!

どうすればいいですか?または1つの命名コンポーネントを上位に移動するにはどうすればよいですか?

時々私のようなものを見た:

update=":table2" 

をしかし、私はこれについての情報を見つけることができませんでした?、JavaEEの6ドキュメントはちょうど@キーワードに言及しています。

答えて

43

醜いが、これはあなたのために動作するはずです:

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

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

<p:commandButton action="..." update=":#{p:component('table2')}" /> 
+1

あなたの答えをありがとう。 #{component.namingContainer.parent.namingContainer.clientId}は正常に動作します。しかし、私はより洗練されたソリューション(構文砂糖)を期待していました。 folderstructuresの場合は "../"と同様です。なぜあなたはまだプレフィックスとしてコロンを書いたのですか?私はjsfに新しいので、私は尋ねる。私はそのテンプレートを複数回使用することができたので、不明な命名コンテナclientIdを直接使用することは、より醜いので、それは醜いとは思わない。私は兄弟ネーミングコンテナのclientIdを取得するEL関数を自分自身で定義すると思います。 – djmj

+1

コロンは、デフォルトの 'NamingContainer'セパレータ文字です(ただし、コンテキストパラメータでオーバーライドできます)。プレフィックスとして使用する場合、クライアントIDは "絶対的な"クライアントIDとして解釈されます。つまり、現在のNamingContainer(コンポジット、データテーブル、フォームなど)の代わりにUIViewRootを基準に解決されています。より良い解決策としては、代わりに 'p:component()'関数を使用してください(または自作してください)。 – BalusC

+2

p:コンポーネントが私のために機能しません。私はこのJSFの動作には本当に悲しいです。何も動作しません。 – MaikoID

0

これを試してみてください:

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

私は十分正確ではありませんでした。すべての要素が同じ形式になっているわけではないので、特定の要素をIDで更新したい。私は自分の投稿を編集してそれを明確にした。 @テーブルは正確に何をするのですか?両方の要素が兄弟である場合、@を使わずにrender = "table"を使うことができますか? – djmj

+0

render = "table"を使うことができます。 –

+1

render = "table"とは何ですか? – Andrew

1

醜い答えは私が動的であることを、更新されたコンポーネントを(生成する必要があったこと、問題があったI上記の解決策に加えても

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

開くダイアログから親への主に、より便利な更新のDataTable

0

の作品多くの場合)サーバー側ロジックに基づいています(入れ子を見つけるのが難しいかもしれません)。

したがって、サーバー側で溶液をorg.primefaces.util.ComponentUtils.findComponentClientId(String designId)を使用update=":#{p:component('table2')}" に相当ある:

例えばそれを使用していくつかの他の方法を介して呼び出さ ​​

... update="#{foo.getCompListComputed('triggeringCompId')}"のようになります。

:最初の私はあまり(あるとして返さ)に解決されていないコースの(:)枠組みがどのように機能するかについて考えた後)... update="#{foo.getCompListSpaced0()}表現でpublic static String getCompListSpaced0() { return ":#{p:component('table2')}" ; }を返すように考え、問題を引き起こす可能性がなくてみました一部のユーザーはそれを経験しました。また、私のEclipse/JBoss Tools環境では、役に立たなかった:#{p.component('table2')}( ":"の代わりに "。")を書くことを提案しました。

0

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> 
関連する問題