Как я могу установить идентификатор компонента / тега внутри пользовательского интерфейса: повтор - PullRequest
8 голосов
/ 05 февраля 2012

Я пытаюсь присвоить 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, это автоматически генерируемый id с помощью JSF + мое жестко закодированное значение column_.

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

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

Есть идеи?

Ответы [ 2 ]

12 голосов
/ 05 февраля 2012

Это невозможно с тегом времени рендеринга, таким как <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}">

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

6 голосов
/ 21 ноября 2012

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

Myform: 0: колонка MyForm: 1: колонка Myform: 2: колонка

и так далее.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...