Как я могу установить идентификатор компонента/тега внутри ui:repeat

Я пытаюсь назначить id компоненту внутри <ui:repeat> вот так:

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

Дело в том, что значение #{column.id} правильно размещается внутри значения styleClass, но не устанавливается внутри атрибута id. Все, что задается внутри атрибута id, — это автоматически сгенерированный JSF id + мое жестко закодированное значение column_.

Если я удалю жестко закодированный column_, я получу исключение:

java.lang.IllegalArgumentException: идентификатор компонента не должен быть строкой нулевой длины в

Любые идеи?


person Daniel    schedule 05.02.2012    source источник


Ответы (2)


Это невозможно с тегом времени рендеринга, таким как <ui:repeat>. Однако <ui:repeat> сам по себе уже обеспечивает уникальность сгенерированного идентификатора клиента, добавляя к нему индекс строки. Поэтому просто удалите часть EL из атрибута ID компонента.

<ui:repeat value="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column">

С тегом времени сборки представления, таким как <c:forEach> (который в основном будет генерировать несколько компонентов <h:panelGroup> вместо одного, который визуализируется несколько раз), можно указать такой динамический идентификатор.

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

(вы должны быть хорошо осведомлены о том, как JSTL работает в Facelets )

Альтернативой является использование статического элемента <div> вместо компонента JSF <h:panelGroup layout="block">.

<ui:repeat value="#{bean.columns}" var="column">
    <div id="column_#{column.id}">

Смотрите также:

person BalusC    schedule 05.02.2012
comment
Спасибо, в конце концов я сделал это с div. Значит ли это, что я не могу самостоятельно назначить динамический идентификатор элементам JSF внутри ui:repeat? только к простым элементам HTML - person Daniel; 05.02.2012
comment
Это правильно. Идентификаторы времени рендеринга не могут быть зарегистрированы в дереве компонентов, это должно быть фиксированное значение, а не динамическое значение. Какое бы функциональное требование вы ни собирались решить, подойдя к нему таким образом, это не будет способом JSF, и вам, возможно, придется дважды подумать об этом, чтобы избежать будущих сюрпризов. - person BalusC; 05.02.2012

JSF автоматически добавляет префикс идентификатора. Если вы просто напишете id="column" сгенерированный HTML будет содержать такие идентификаторы:

myForm:0:столбец myForm:1:столбец myForm:2:столбец

и так далее.

В любом случае: никогда не используйте теги JSTL (например, c:foreach и c:if) в шаблонах JSF. Они вызывают случайное поведение, которое очень трудно отладить. А если и работают, то сильно тормозят работу приложения.

Используйте ui:repeat для циклов и ui:fragment для условных блоков. Обратите внимание, что для c:set нет замены, такой конструкции больше нет в JSF 2.

person Stefan    schedule 21.11.2012
comment
Работал как шарм, и это было отличное объяснение. Мне также интересно, почему за него проголосовали против, но я проголосую за, так как это имеет большой смысл. - person Bruno Gasparotto; 22.08.2015
comment
Понижение связано с тем, что в любом случае: никогда не используйте теги JSTL (например, c: foreach и c: if) в шаблонах JSF. Они вызывают случайное поведение, которое очень трудно отладить. А если и работают, то сильно тормозят работу приложения. что просто неправда - person Kukeltje; 12.04.2018
comment
+1 вопреки причине комментария выше. Например, c:foreach, unline ui:repeat, находится во время компиляции и не обновляется запросом ajax. - person Marco Sulla; 14.07.2021