Использование f:selectItems var в атрибуте passtrough

Я могу передать выражения в JSF 2 passthrough-attribute? следующий код не работает. выражение #{country.isoCode} не оценивается.

<h:selectOneMenu value="#{bean.selectedCountry}" styleClass="selectlist">
   <f:selectItems 
            value="#{bean.countries}" var="country"
            itemLabel="#{country.countryName}" 
            pt:data-icon="flag flag-#{country.isoCode}"/>                
</h:selectOneMenu>

Я использую пространство имен

xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"

и начальная загрузка Атрибут "data-icon" используется для отображения изображения. увидеть:

http://silviomoreto.github.io/bootstrap-select/

предоставленный вывод:

<i class="glyphicon flag flag-"></i> 

1 ответ

Решение

EL в основном поддерживается / оценивается по всему месту в шаблоне Facelet. Также вне тегов / атрибутов. Даже в комментариях HTML, где многие начинающие потом падают. Так что это не проблема.

Ваш частный случай, к сожалению, "по замыслу". Перед рендерингом первый <option> элемент, <f:selectItems> is полностью анализируется только один раз и превращается в итератор, в течение которого будут вычисляться все выражения EL. Затем компонент будет перебирать его во время рендеринга. <option> элементы, во время которых будут оцениваться все сквозные атрибуты. Тем не менее, как var был уже оценен во время создания итератора, он нигде не доступен во время рендеринга атрибутов passthrough и в конечном итоге оценивается как пустая строка.

Исправление, которое потребовало бы некоторых изменений в стандартной реализации JSF <f:selectItems>, Я не уверен, что парни из JSF будут всем этим заниматься, но вы всегда можете попытаться создать проблему.

Вы можете обойти это, создав физически несколько <f:selectItem> экземпляры во время построения представления, с помощью <c:forEach>,

<h:selectOneMenu ...>
    <c:forEach items="#{bean.countries}" var="country">
        <f:selectItem 
            itemValue="#{country}" 
            itemLabel="#{country.countryName}" 
            pt:data-icon="flag flag-#{country.isoCode}" />   
    </c:forEach>             
</h:selectOneMenu>

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

Другие вопросы по тегам