jsf-2 - 使用f :selectItems var in passtrough attribute

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

可以将表达式传递给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"

和引导选择。属性“数据图标”用于显示图像。看:

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

呈现的输出:
<i class="glyphicon flag flag-"></i> 

最佳答案

基本上,Facelet模板中的所有位置都支持/评估EL。外部标签/属性。即使在HTML注释中,也有很多入门者倒下。所以那不是问题。

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

要解决该问题,需要对<f:selectItems>的标准JSF实现进行一些更改。我不确定JSF的家伙是否会为此留心,但是您可以随时尝试create an issue

您可以通过在<f:selectItem>的帮助下在 View 构建期间实际创建多个<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>

也可以看看:
  • JSTL in JSF2 Facelets... makes sense?
  • 关于jsf-2 - 使用f :selectItems var in passtrough attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671305/

    相关文章:

    jsf - 如何使用 CDI 将 http session 属性注入(inject)到 bean

    java - 如何从 View /内部代码访问 javax.faces.PROJECT_STAGE?

    jsf - 根据当前 View 处理 ViewExpiredException

    jsf - Javascript 中的 Intellij EL 表达式验证问题

    java - 使用 JSTL 标签(点字符)转义 JSP EL

    java - 为什么我的 Controller setter 在我的 PrimeFaces 项目中不起作用?

    jsf - 托管 bean ManagedBean 的托管 bean 类 java.time.ZonedDateTime 未声明公共(public)无参数构造函数

    servlets - PrimeFaces 文件上传

    jsf-2 - 更改组件语言 PrimeFaces

    java - 在 Javascript 文件中获取 EL,由 @ResourceDependency 加载