2012-02-05 12 views
5

próbuję przypisać identyfikator AH: panelGroup wewnątrz ui: repeatJak mogę ustawić identyfikator godz: panelGroup wewnątrz ui: repeat

jak ten

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

Chodzi o to, że #{column.id} Wartość jest umieszczana prawidłowo wewnątrz wartości styleClass, ale nie jest ustawiona wewnątrz atrybutu id. Wszystko, co jest ustawiane wewnątrz atrybutu id, jest automatycznie generowanym identyfikatorem przez JSF + moja zakodowana wartość "column_" i jeśli usunąłem mocno zakodowaną "kolumnę", otrzymuję eksces ption

java.lang.IllegalArgumentException: identyfikator komponentu nie musi być zero-length string na

jakieś pomysły?

Odpowiedz

10

Nie jest to możliwe z tagiem czasu renderowania, takim jak <ui:repeat>. Model <ui:repeat> sam jednak zapewni unikalność wygenerowanego identyfikatora klienta, poprzedzając go indeksem wiersza. Po prostu usuń część EL z atrybutu ID komponentu.

Przy pomocy znacznika czasu budowy, takiego jak <c:forEach> (który zasadniczo generuje wiele komponentów <h:panelGroup> zamiast tylko jednego, który jest renderowany wiele razy), możliwe jest określenie takiego dynamicznego identyfikatora.

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

(powinna być jedynie well aware, jak JSTL pracuje w Facelets)

Alternatywą jest użycie statycznego <div> elementu zamiast JSF <h:panelGroup layout="block"> komponentu.

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

Dzięki, w końcu to zrobiłem z div. Oznacza to, że nie mogę przypisać dynamicznego identyfikatora elementom JSF wewnątrz interfejsu użytkownika: powtórzyć samemu? tylko do prostych elementów HTML – Daniel

+1

Zgadza się. Identyfikatory Render-time nie mogą być zarejestrowane w drzewie komponentów, musi to być stała wartość zamiast wartości dynamicznej. Niezależnie od tego, jakie wymagania funkcjonalne rozwiążesz, podchodząc do tego w ten sposób, nie będzie to metoda "JSF-owska" i być może będziesz musiał pomyśleć dwa razy, aby uniknąć przyszłych niespodzianek. – BalusC

6

JSF automatycznie dodaje numer identyfikacyjny. Jeśli po prostu napisać id = "kolumna" wygenerowany HTML będzie zawierać takie identyfikatory:

myForm: 0: kolumna myForm: 1: kolumna myForm: 2: kolumna

i tak dalej.

W każdym razie: Nigdy nie używaj znaczników JSTL (takich jak c: foreach i c: if) w szablonach JSF. Powodują przypadkowe zachowanie, bardzo trudne do debugowania. A jeśli działają, spowalniają aplikację.

Użyj polecenia ui: repeat dla pętli, a ui: fragment dla bloków warunkowych. Zauważ, że nie ma zamiennika dla c: set, taka konstrukcja już nie istnieje w JSF 2.

+1

Dlaczego upadek? Potrzebujesz wyjaśnienia. – xiefei

+0

Pracował jak urok i było to świetne wytłumaczenie.Zastanawiam się również, dlaczego to się stało, ale będę się głosował, ponieważ ma to wiele sensu. –

Powiązane problemy