【问题标题】:How to use ui:include inside a forEach and use the loop variable inside the included page?如何在 forEach 中使用 ui:include 并在包含的页面中使用循环变量?
【发布时间】:2011-04-26 20:21:44
【问题描述】:

我正在 Tomcat 7.0.12 中升级到 JSF 2.0.2,并且我有一个页面,上面有可变数量的可重用小部件。我曾经为此使用 t:aliasBean ,但它似乎不起作用。我现在在我的 Xhtml 中尝试以下操作:

<c:forEach items="${viewBean.currentView.parts}" var="part">
<t:div styleClass="div#{viewBean.partNumber[part]}">
    <c:forEach items="${part.widgets}" var="widget">
        <f:subview id="div#{viewBean.widgetId[widget]}">
            <ui:include src="widgets/#{widget.widgetPage}">
                <ui:param name="widget" value="#{widget}" />
            </ui:include>
        </f:subview>
    </c:forEach>
</t:div>
</c:forEach> 

似乎发生的情况是循环中的下一个小部件在前一个小部件的页面中使用,所以除非只有一个小部件,否则我会收到错误。

编辑:我试过 ui:repeat - 它不起作用。我也尝试删除 ui:include,作为一个健全性测试;循环工作正常。另外,我使用的是 Spring 2.5.6.SEC01 - 虽然这不重要。

【问题讨论】:

  • 我正在尝试做类似的事情。自从您发布此问题以来,您是否找到了解决方案?已经有一段时间没有其他人回复了。
  • 我以编程方式创建了一个新的 xhtml 并将小部件复制到其中。然后我 ui:include 那个。这并不理想,但我无法让它工作。

标签: jsf jsf-2


【解决方案1】:

我建议使用ui:repeat 而不是c:forEach

为什么?

最重要的要理解 关于 Facelets 中的 jstl 标签是 它们不代表组件 并且永远不会成为其中的一部分 一旦视图已经被组件树 建成。相反,它们是标签 实际负责建设 首先是树。一旦他们 已经完成了他们的工作,他们过期了,是 不再存在,不再存在,等等。

来源[此处][1]。我真的建议阅读整篇文章。

更新

请注意,我并不是说c:forEach 不好。我想强调不建议将其与ui:repeat 混合使用。 [1]:https://rogerkeays.com/jsf-c-foreach-vs-ui-repeat

【讨论】:

  • 同意这一点,这个参考很好。他可能仍然面临的一个问题是 f:subview 的 id 属性(坦率地说,大多数 jsf 组件上的 id )不采用 ValueExpression,只有一个字符串,所以我不确定切换到 ui:repeat 是否会有所帮助这个案例。
  • 我确实读过。显然你没有,因为它提到在 ui:repeat 中使用 ui:include 并建议使用 c:forEach
  • 我同意你那里的报价。它让我得到一个我非常不确定的答案,我会把它放在这里:问题是 c:forEach 是在 facelets 中评估的,但是 #{widget} 引用被推迟到稍后当小部件“过期等”时。 "。
  • 这个答案无效,因为手头的问题包括 ui:include
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2019-04-22
  • 1970-01-01
  • 2016-10-31
  • 2018-08-23
相关资源
最近更新 更多