Использование 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>