【问题标题】:Use c:set inside ui:repeat does not work在 ui:repeat 中使用 c:set 不起作用
【发布时间】:2012-01-13 03:05:30
【问题描述】:

我有一个带有以下代码的 JSF 2 应用程序:

<c:set var="number" value="0" scope="view" />
<ui:repeat value="${items}" var="item" varStatus="itemIndex">
    <c:if test="${item.boolProperty == true}">
        <c:set var="number" value="${number + 1}" scope="view" />
    </c:if>
    <h:outputText value="#{item.name}" />: <h:outputText value="#{number}" />
</ui:repeat>

我想根据循环中项目的属性增加数量。但是,条件似乎不起作用,因为 number 的值始终保持为 0。如果我删除条件,number 只会增加一次,或者在增加之前它始终为 0,因此它输出 1。可以吗number var 的变化是否可能不会影响循环外的 number var?我相信scope 属性可以解决这个问题。

【问题讨论】:

    标签: jsf jstl facelets uirepeat


    【解决方案1】:

    JSTL 标记和 JSF 组件不会像您对编码所期望的那样同步运行。 JSTL 标记在构建 JSF 视图期间运行,而 JSF 组件在呈现 JSF 视图期间运行。详细解释见JSTL in JSF2 Facelets... makes sense?

    遗憾的是,JSF 组件无法实现您想要实现的目标。 &lt;ui:param&gt; 很接近,但它仅作为更复杂的 EL 表达式的别名起作用,而 &lt;c:set&gt; 实际上在所需范围内设置了一些东西(顺便说一下,你所拥有的 view 范围是错误的) .

    最好的办法是更改模型或将模型包装在另一个模型中,以便最终成为

    <ui:repeat value="${items}" var="item" varStatus="itemIndex">
        <h:outputText value="#{item.name}" />: <h:outputText value="#{item.number}" />
    </ui:repeat>
    

    【讨论】:

    • 好的,感谢您的澄清。有没有办法在 jsf 布局中做我想要的。也许使用param
    • 我已经回答过了,JSF 组件是不可能的。
    • 好的,感谢您的帮助。我现在正在使用该项目的属性并且它正在工作。
    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2014-05-30
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多