JSF2 EL не отображается в идентификаторах компонентов - PullRequest
4 голосов
/ 21 февраля 2012

У меня есть следующий фрагмент кода:

<ui:repeat var = "ctr" value = "#{bean.counterList}">
    <h:outputLabel for = "message#{ctr}" value = "#{appMessage['No #{ctr} :" />
<h:inputText id="message#{ctr}" value="#{bean.messageList}" />
</ui:repeat>

counterList - это List<String>. Если в списке содержится 1, 2, 3, то у вас должно быть 3 поля ввода с идентификаторами: message1, message2, message3.

EL не влияет на атрибут id , и все компоненты получают только сообщение в качестве идентификатора. С другой стороны, в значении лейбла EL отлично работает.

Я могу представить, что это может быть желаемое поведение, но есть ли обходной путь?

UPDATE:

Я удалил атрибут id, а ui:repeat теперь отвечает за присвоение идентификаторов. Из исходного кода я вижу, что сгенерированные идентификаторы уникальны, но теперь выдается это предупреждение:

INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=fm-story:j_idt103:0:j_idt54[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'.), detail=(Conversion Error setting value '' for 'null Converter'.)]
sourceId=fm-story:j_idt103:1:j_idt54[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'.), detail=(Conversion Error setting value '' for 'null Converter'.)]

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012

Я не проверял это, но правильное поведение будет иметь вид:

<ui:repeat var = "ctr" value = "#{bean.counterList}">
  <h:outputLabel for="message" value="#{appMessage['No #{ctr} :" />
  <h:inputText id="message" value="#{bean.messageList}" />
</ui:repeat>

Идентификатор компонента message не изменится; идентификатор клиента (например, fm-story:j_idt103:0:message) будет изменяться для каждой строки во время обработки жизненного цикла.Алгоритм атрибута for компонента метки сможет находить входной компонент, используя «сообщение», поскольку они совместно используют контейнер имен.

2 голосов
/ 21 февраля 2012

Проблема, которую вы пытаетесь решить, описана здесь Динамические идентификаторы в JSF / Seam и здесь http://illegalargumentexception.blogspot.com/2009/05/jsf-using-component-ids-in-data-table.html

1 голос
/ 21 февраля 2012

это та же проблема, что и у меня ... Как я могу установить идентификатор h: panelGroup внутри пользовательского интерфейса: повтор

вы не можете установить идентификаторы на лету с помощью пользовательского интерфейса:повторить (см. ссылку выше)

Вы можете использовать <c:forEach

как этот

<c:forEach var = "ctr" items = "#{bean.counterList}">
    <h:outputLabel for = "message#{ctr}" value = "#{appMessage['No #{ctr} :" />
    <h:inputText id="message#{ctr}" value="#{bean.messageList}" />
</c:forEach>

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

0 голосов
/ 22 февраля 2012

Вы не должны пытаться вручную индексировать идентификаторы компонентов внутри полноценного итеративного компонента JSF, такого как <ui:repeat>, <h:dataTable> и так далее. Это приведет только к катастрофе, как вы испытали себя. Он будет работать внутри JSTL <c:forEach>, потому что он работает как тег времени сборки представления в момент, когда должно быть построено дерево компонентов JSF, а не в тот момент, когда должен генерироваться вывод HTML. <c:forEach> также будет генерировать физически столько компонентов JSF, сколько было повторено.

Просто опустите любой атрибут EL из id. Компонент JSF будет беспокоиться о автоматической установке правильного идентификатора клиента. Кроме того, вы можете использовать varStatus атрибут <ui:repeat>, чтобы получить текущий счетчик и индекс цикла. Таким образом, вам не нужно 2 списка. Счет покажет текущий раунд. Индекс является обязательным для получения / установки значения List<String> по индексу. <h:inputText value="#{message}" /> не будет работать, потому что класс String не имеет установщика.

<ui:repeat value="#{bean.messageList}" var="message" varStatus="loop">
    <h:outputLabel for="message" value="#{appMessage['No']} #{loop.count}:" />
    <h:inputText id="message" value="#{bean.messageList[loop.index]}" />
</ui:repeat>

(при необходимости вы можете опустить var="message" из приведенного выше фрагмента, поскольку он нигде не используется)

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