2012-02-05 5 views
5

を繰り返して、私はああにIDを割り当てるしようとしている:UI内部panelGroup:事はことであるは、どのように私は、hのIDを設定することができます:panelGroup UI内側:

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}"> 

よう

を繰り返し#{column.id}値はstyleClass値の中に正しく配置されていますが、id属性内に設定されていないものはid属性内に設定されているすべてのものがJSF +によって自動的に生成されたIDです。ハードコーディングされた「column_」を削除します。私はexceを取得します。 ption

java.lang.IllegalArgumentExceptionが:コンポーネント識別子は

任意のアイデアがで長さゼロの文字列 あってはなりませんか?

答えて

10

<ui:repeat>などのレンダリング時間タグでは不可能です。ただし、<ui:repeat>は、それ自体が、行インデックスを前に付けることによって、生成されたクライアントIDの一意性を既に保証します。そのため、コンポーネントのID属性からEL部分を削除するだけです。

<c:forEach>などのビュー構築時間タグ(複数回レンダリングされるものの1つではなく、基本的に複数の<h:panelGroup>コンポーネントを生成する)では、そのような動的IDを指定することができます。

<c:forEach items="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}"> 

代替は、JSFコンポーネント<h:panelGroup layout="block">するのではなく、静的<div>要素を使用することです(あなただけJSTLはFaceletsの中でどのように動作するかのwell awareでなければなりません)。

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <div class="#{column.id} dashboard_column" id="column_#{column.id}"> 
+0

ありがとうございました。つまり、私はUI内のJSF要素に動的IDを割り当てることができません:自分で繰り返しますか?単純なHTML要素にのみ – Daniel

+1

正しいです。レンダリング時間IDはコンポーネントツリーに登録することはできません。動的時間ではなく固定値でなければなりません。どのような機能要件がこのように近づいて解決しようとしているとしても、それは「JSF-ish」のやり方ではなく、将来の驚きを避けるためにこれについて2回考える必要があります。 – BalusC

6

JSFはidに自動的に接頭辞を付けます。あなたは、単にIDを記述する場合= "コラム" 生成されたHTMLは、そのような識別子が含まれています:

あるmyForm:0:列 あるmyForm:1:列 あるmyForm:2:列

のように。

とにかく:JSFテンプレートでJSTLタグ(c:foreachやc:ifなど)を使用しないでください。それらはランダムな動作を引き起こし、デバッグは非常に困難です。そして、彼らがうまくいけば、アプリケーションをたくさん遅くします。

ループの場合はui:repeat、条件ブロックの場合はui:fragmentを使用します。 c:setに代わるものはないことに注意してください。このようなコンストラクトはJSF 2にはもう存在しません。

+1

なぜdownvote?説明が必要です。 – xiefei

+0

魅力のように働き、大きな説明でした。私はなぜそれがdownvoteを持っているのだろうかと思っていますが、それは多くの意味があるので、私はupvoteします。 –

関連する問題