индекс ui: repeat пуст [дубликат]

Вы можете использовать Task.WhenAll, как указано, или Task.WaitAll, в зависимости от того, хотите ли вы, чтобы нить подождал. Взгляните на ссылку для объяснения того и другого.

WaitAll vs WhenAll

10
задан BalusC 21 August 2013 в 14:40
поделиться

1 ответ

Вы можете использовать EL в атрибуте id для компонента JSF, но переменная EL должна быть доступна во время сборки времени, тогда как дерево компонентов JSF должно быть создано. Тем не менее, <ui:repeat> работает во время отображения времени визуализации, тогда как вывод HTML должен быть создан на основе дерева компонентов JSF. <ui:repeat var> недоступен во время времени сборки, а #{class2.name} - null, что полностью объясняет полученную вами ошибку. То, что оно работает в <h:outputText>, связано с тем, что оно выполняется во время визуализации рендеринга.

Если вы замените <ui:repeat> на <c:forEach>, который выполняется во время времени сборки, тогда он будет работать так, как вы намерены. <c:forEach> будет генерировать физически несколько <h:form> компонентов в дереве компонентов JSF, каждый из которых генерирует индивидуально свой собственный вывод HTML (в отличие от <ui:repeat>, в котором тот же самый компонент <h:form> повторно используется несколько раз для генерации HTML output).

<c:forEach var="class2" items="#{bean.list}" varStatus="status">
  <h:form id="#{class2.name}"> 
    <h:outputText value="#{class2.name}" />
  </h:form>
</c:forEach>

Однако я действительно удивляюсь, зачем вам это нужно. Обычно нет необходимости динамически назначать идентификаторы компонентов. JSF уже обеспечит уникальность идентификатора. В приведенном ниже примере

<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
  <h:form id="form"> 
    <h:outputText value="#{class2.name}" />
  </h:form>
</ui:repeat>

будет отображаться в нескольких формах с каждым уникальным идентификатором, заполненным индексом итерации <ui:repeat>. Если вам действительно нужно использовать #{class2.name} для некоторых целей JavaScript / jQuery (вы нигде не указали конкретное функциональное требование в вопросе, для которого вы думали, что это будет правильное решение, так что это просто догадки), а затем просто оберните его простой HTML-элемент ванили:

<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
  <div id="#{class2.name}"> 
    <h:form id="form">
      <h:outputText value="#{class2.name}" />
    </h:form>
  </div>
</ui:repeat>

Или задайте его как класс стилей компонента JSF, который также можно выбрать с помощью селектора CSS:

<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
  <h:form id="form" styleClass="#{class2.name}">
    <h:outputText value="#{class2.name}" />
  </h:form>
</ui:repeat>

См. также:

25
ответ дан Community 17 August 2018 в 23:41
поделиться
  • 1
    Этот вопрос сбил меня с ума. +1 для чистого объяснения ПОЧЕМУ это не сработало, а не просто решение проблемы. В моем случае несколько форм будут работать, но они не будут правильно вводить данные формы (только для последней таблицы). Данные не были установлены, и я продолжал получать нуль. Это фактически решило проблему. Благодаря! Поэтому помните, если у вас есть несколько форм, созданных в ui: repeat, а данные в формах равны null, прочитайте сообщение @ BalusC и +1 его решение !;) – javatarz 27 September 2013 в 07:45
Другие вопросы по тегам:

Похожие вопросы: