Условно показать изображение в JSF внутри dataList

Внутри итерации с простыми данными dataList я хочу сделать изображение условно следующим образом:

<ui:param name="curTriggerState" value="#{jobListController.getTriggerState(curJobTriggerInfo)}" />
<p:column rendered="#{showCurJobTrigger}">
    <h:outputText value="#{curTriggerState}" />
    <h:graphicImage value="/resources/images/triggerstate_none_48.png" 
        rendered="#{curTriggerState eq 'NONE'}" />
    <h:graphicImage value="/resources/images/triggerstate_normal_48.png" 
        rendered="#{curTriggerState eq 'NORMAL'}" />
    <h:graphicImage value="/resources/images/triggerstate_paused_48.png" 
        rendered="#{curTriggerState eq 'PAUSED'}" />
    <h:graphicImage value="/resources/images/triggerstate_complete_32.png" 
        rendered="#{curTriggerState eq 'COMPLETE'}" />
    <h:graphicImage value="/resources/images/triggerstate_error_48.png" 
        rendered="#{curTriggerState eq 'ERROR'}" />
    <h:graphicImage value="/resources/images/triggerstate_blocked_48.png" 
        rendered="#{curTriggerState eq 'BLOCKED'}" />
</p:column>

jobListController.getTriggerState возвращает проверенную строку в соответствующем атрибуте рендеринга. OutputText выводит правильное состояние. Но изображение не нарисовано. Пути к изображениям верны, если я установил rendered="true", изображение будет нарисовано. Не могу найти мою ошибку. Думаю, причиной может быть ui: param, но outputText выводит правильную строку.

3 ответа

Решение

Это была моя вина. В настоящее время бэкэнд-сервис является имитацией, которая случайным образом возвращает состояние триггера. Кажется, что bean-компонент (и, следовательно, backend) вызывается не только один раз за графическое изображение, но и несколько раз. Когда каждый вызов возвращает различное состояние триггера, изображение и заголовок могут, конечно, отличаться. Я немного удивлен этим, потому что я присваиваю значение с помощью ui:param и думал, что метод вспомогательного компонента будет вызываться только один раз для graphicImage.

Наконец, я изменил его, чтобы сгенерировать имя файла, которое меньше кода. Но мне вообще не нравится генерировать патчи для файлов по состояниям и следовать шаблону имени файла. Но это работает:

<ui:param name="curTriggerStateName" value="#{jobListController.getTriggerStateName(curJobTriggerInfo)}" />
<h:graphicImage value="/resources/images/triggerstate_#{curTriggerStateName}_20.png" styleClass="triggerStateImage"
            title="#{curTriggerStateName}" />

Это работает... но мне не нравится генерировать путь к изображению

<ui:param name="curTriggerStateName" value="#{jobListController.getTriggerStateName(curJobTriggerInfo)}" />
<h:graphicImage value="/resources/images/#{jobListController.getTriggerStatusImageName(curJobTriggerInfo)}" 
                        style="margin-right: 3px !important;"/>
Другие вопросы по тегам