Укажите условную визуализацию элемента внутри?не похоже на работу - PullRequest
18 голосов
/ 30 августа 2011

Я пытаюсь условно построить пользовательский список, используя <ui:repeat>. При каждом появлении -1 в качестве значения элемента в списке мне нужно добавить разрыв строки.

Я пытался использовать <c:if> внутри <ui:repeat> для этого, но, похоже, это не работает. Всегда оценивается false.

<ul>      
    <ui:repeat value="#{topics.list}" var="topicId" >
        <li>#{topicId}</li>
        <c:if test="#{topicId eq -1}">  <br/>  </c:if>
    </ui:repeat>
</ul>

Возможно ли это?

1 Ответ

31 голосов
/ 30 августа 2011

Не с тегами JSTL, нет.Они запускаются во время построения представления, а не во время отображения представления.Вы можете визуализировать это следующим образом: когда JSF создает представление, теги JSTL сначала выполняются снизу, и в результате получается чистое дерево компонентов JSF.Затем, когда JSF отображает представление, компоненты JSF работают сверху вниз, и в результате получается куча HTML.Итак, JSTL и JSF не работают синхронно, как вы ожидаете от кодирования.В момент выполнения <c:if> #{topicId} недоступен в области.

Вместо использования <c:if> необходимо указать условие в атрибуте rendered компонента JSFпредставляет интерес.Поскольку у вас их фактически нет, вы можете обернуть их в <ui:fragment>.

<ul>      
    <ui:repeat value="#{topics.list}" var="topicId" >
        <li>#{topicId}</li>
        <ui:fragment rendered="#{topicId eq -1}"><br/></ui:fragment>
    </ui:repeat>
</ul>

Альтернативы: <h:panelGroup>

<h:panelGroup rendered="#{topicId eq -1}"><br/></h:panelGroup>

или в вашем конкретном случае <h:outputText escape="false">

<h:outputText value="&lt;br/&gt;" escape="false" rendered="#{topicId eq -1}" />

, поскольку оба также не генерируют ничего другого для вывода HTML, когда не указаны атрибуты на стороне клиента.

См.также:


Не связано с конкретной проблемойэто неправильное место для <br/>.Это будет игнорироваться любым веб-браузером, уважающим спецификацию HTML.Разве вы не имеете в виду, что это будет внутри <li>?Или лучше, дайте ему class и позвольте CSS дать ему margin-bottom.

...