Условно показать изображение в 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;"/>