‹c:choose›‹c:when› на странице JSF не работает, кажется, всегда оценивается как false

На моей странице JSF я использую тег <c:choose><c:when> для условного отображения содержимого. Однако это не работает, так как кажется, что всегда оценивается false.

E.g.

<h:outputText value="#{pollInfo.active} -" />
<c:choose>
    <c:when test="#{pollInfo.active}">
        <h:outputText value="Active" />
    </c:when>
    <c:otherwise>
        <h:outputText value="Deactive" />
    </c:otherwise>
</c:choose>

Наверняка есть несколько элементов с active=true, что подтверждается <h:outputText>, но он просто печатает Deactive для всех элементов. Вы можете увидеть фактический результат на следующем рисунке:

введите здесь описание изображения

Чем это вызвано и как я могу это решить?


person Rasoul Taheri    schedule 09.12.2013    source источник


Ответы (1)


Симптомы и снимок экрана предполагают, что #{pollInfo} представляет текущий повторяющийся элемент повторяющегося компонента пользовательского интерфейса, такого как <ui:repeat>, <h:dataTable>, <p:tabView>, <p:dataTable> и т. д.

Теги JSTL запускаются во время построения представления, в тот момент, когда дерево компонентов JSF строится на основе исходного кода XHTML. Атрибут var такого повторяющегося компонента пользовательского интерфейса доступен только во время рендеринга просмотра, в тот момент, когда вывод HTML создается на основе дерева компонентов JSF.

Другими словами, они не работают синхронно. #{pollInfo} всегда null во время построения представления.

В этом конкретном случае вам нужен атрибут rendered компонента JSF.

<h:outputText value="Active" rendered="#{pollInfo.active}" />
<h:outputText value="Deactive" rendered="#{not pollInfo.active}" />

Или, если вы намерены условно отображать большие фрагменты кода, оберните все в <ui:fragment>:

<ui:fragment rendered="#{pollInfo.active}">
    <h:outputText value="Active" />
    <!-- Some more components here if necessary. -->
</ui:fragment>
<ui:fragment rendered="#{not pollInfo.active}">
    <h:outputText value="Deactive" />
    <!-- Some more components here if necessary. -->
</ui:fragment>

Еще одна альтернатива, учитывая, что у вас есть чистый if-else, использует условный оператор в EL:

<h:outputText value="#{pollInfo.active ? 'Active' : 'Deactive'}" />

Дополнительным бонусом является то, что вы получаете гораздо меньше кода.

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

person BalusC    schedule 09.12.2013