在passtrough属性中使用f:selectItems var

时间:2015-04-16 09:57:29

标签: jsf-2 el managed-bean selectonemenu passthrough-attributes

我可以将表达式传递给JSF 2 passthrough-attributes吗? 以下代码无效。表达式#{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"

和bootstrap-select。属性“data-icon”用于显示图像。见:

http://silviomoreto.github.io/bootstrap-select/#data-icon

渲染输出:

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

1 个答案:

答案 0 :(得分:10)

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

不幸的是,您的具体案例是&#34;设计&#34;。 呈现第一个<option>元素之前,<f:selectItems>只被解析一次并变成迭代器,在此期间将评估所有EL表达式。然后,组件将在渲染<option>元素的同时迭代它,在此期间将评估所有直通属性。但是,由于在创建迭代器期间var 已经已经评估,因此在呈现直通属性期间它无法在任何地方使用,并最终评估为空字符串。

修复<f:selectItems>的标准JSF实现需要进行一些更改。我不确定JSF的人是否会全力以赴,但你总是可以尝试create an issue

您可以在<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>

另见: