Условно показать изображение в 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 возвращает строку, проверенную в соответствующем атрибуте рендеринга. ouputText выводит правильное состояние. Но изображение не рисуется. Пути изображений верны, если я установил rendered="true" изображение нарисовано. Не могу найти свою ошибку. Думал, что причиной может быть ui:param, но outputText выводит правильную строку.


person opfau    schedule 08.07.2014    source источник
comment
Это работает, если вы делаете rendered=#{jobListController.getTriggerState(curJobTriggerInfo) eq 'NONE'} /› и т. д.?   -  person Emil Kaminski    schedule 08.07.2014
comment
Это сработает, если вы попробуете ‹h:graphicImage value=/resources/images/triggerstate_none_48.png rendered=true /›?   -  person user3489875    schedule 08.07.2014
comment
да. С rendered=true ist работает (как написано в посте :))   -  person opfau    schedule 08.07.2014
comment
Используйте == вместо eq для сравнения перечисления: равенство в jsf">stackoverflow.com/questions/2524420/   -  person Xtreme Biker    schedule 08.07.2014
comment
Но getTriggerState() возвращает строку. Но с == поведение не меняется.   -  person opfau    schedule 08.07.2014
comment
Кажется, я не могу найти ничего плохого в вашем коде. Это может быть дикий выстрел, но, возможно, строка, возвращаемая из метода jobListController.getTriggerState(curJobTriggerInfo), содержит некоторые пробелы? Попробуйте изменить его, чтобы вернуть статическую строку и снова проверить   -  person Emil Kaminski    schedule 08.07.2014
comment
Нет, пробелов нет. Я также проверил правильность возврата с помощью ‹h:outputText value=#{curTriggerState} /›. Я нашел другое решение, которое я опубликую здесь в качестве ответа.   -  person opfau    schedule 09.07.2014


Ответы (3)


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

<ui:param name="curTriggerStateName" value="#{jobListController.getTriggerStateName(curJobTriggerInfo)}" />
<h:graphicImage value="/resources/images/triggerstate_#{curTriggerStateName}_20.png" styleClass="triggerStateImage"
            title="#{curTriggerStateName}" />
person opfau    schedule 09.07.2014
comment
В порядке. Это не работает. После того, как я проверил внутренние данные, изображения неверны. Доставленное состояние в curTriggerStateName помещается в заголовок, который отображается в виде всплывающей подсказки в браузере над изображением. Изображение для государства является неправильным. напр. что-то вроде этого отображается как html: ‹img class=triggerStateImage title=complete src=/schedule/resources/images/triggerstate_paused_20.png› - person opfau; 09.07.2014
comment
Это должно быть ‹img class=triggerStateImage title=complete src=/schedule/resources/images/triggerstate_complete_20.png› - person opfau; 09.07.2014
comment
Я думаю, что мне не хватает некоторых фундаментальных знаний о внутренностях JSF с использованием материала ui: param? Думаете, ui:param можно установить только один раз? Вокруг кода есть p:dataList. - person opfau; 09.07.2014
comment
Протестировал его без ui:param и напрямую использовал вызов getTriggerStateName. Это ничего не меняет. - person opfau; 09.07.2014

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

<ui:param name="curTriggerStateName" value="#{jobListController.getTriggerStateName(curJobTriggerInfo)}" />
<h:graphicImage value="/resources/images/#{jobListController.getTriggerStatusImageName(curJobTriggerInfo)}" 
                        style="margin-right: 3px !important;"/>
person opfau    schedule 08.07.2014
comment
Насколько я понимаю, этот вопрос больше связан с атрибутом rendered, чем с самим путем. Путь на самом деле правильный, но изображение не отображается, не в этом ли проблема? - person Xtreme Biker; 08.07.2014
comment
да. Вот именно в этом проблема (чего я не понимаю). - person opfau; 08.07.2014

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

person opfau    schedule 09.07.2014