6

我可以将表达式传递给 JSF 2 传递属性吗?以下代码不起作用。#{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/#data-icon

渲染输出:

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

1 回答 1

11

EL 基本上在 Facelet 模板中的所有位置都得到支持/评估。也在标签/属性之外。即使在 HTML 注释中,许多初学者也会失败。所以这不是问题。

不幸的是,您的特殊情况是“设计使然”。渲染第一个<option>元素之前,<f:selectItems>is 只被完全解析一次并变成一个迭代器,在此期间所有的 EL 表达式都将被计算。然后,组件将在渲染元素时对其进行迭代,在此<option>期间将评估所有传递属性。但是,由于在创建迭代器var期间已经对 进行了评估,因此在呈现传递属性期间它在任何地方都不可用,并最终评估为空字符串。

解决这个问题需要对<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>

也可以看看:

于 2015-04-16T13:33:05.033 回答