【问题标题】:Why won't my Facelets loop variable go out of scope?为什么我的 Facelets 循环变量不会超出范围?
【发布时间】:2010-11-11 04:48:08
【问题描述】:

我知道这看起来像很多文字,但我认为这是一个我缺少的非常简单的概念。

我正在使用 Facelets 编写一个 Web 应用程序。我有一个自定义标签 rq:request-list,它将请求列表作为参数并输出一个可爱的表格来显示它们。到目前为止,一切顺利。

rq:request-list 开始于你所期望的:

<!-- ... -->
<ice:dataTable value="#{list}" var="req">
    <ice:column>
        <f:facet name="header">Date last edited</f:facet>
        <ice:outputText value="#{req.dateModified}" />
    </ice:column>
<!-- ... -->

结果很好。它甚至在表格中有一个链接来编辑请求。伊皮!

<ice:column rendered="#{spokespersonView}">
    <f:facet name="header">Edit</f:facet>
    <h:commandLink value="Edit" action="edit_r" rendered="#{RequestSessionBean.mutable}">
        <f:setPropertyActionListener target="#{RequestSessionBean.request}" value="#{req}"/>
    </h:commandLink>
</ice:column>

在将 backing bean 中的请求设置为我们所在的表行所表示的请求之后,这会将我们带到编辑页面。这就是问题所在。而且很微妙。

rq:request-list 在一页中多次使用;像这样:

<ui:repeat value="#{ExperimentListBean.usersExperiments}" var="exp">
    <rq:request-list list="#{RequestListBean.requestsByExperiment[exp]}" showExperiment="false" spokespersonView="true" />
</ui:repeat>

现在表格出现OK;也就是说,所有的文字都是正确的。但是,commandLinks 指向了错误的请求……它们指向页面上 last rq:request-list 对应行的请求。与请求有关的数据按应在表中的形式输出,但 {req} 在单击 commandLink 时指向错误的请求。

重申一下,如果我在一个页面上有几个 rq:request-lists,every rq:request-list 第一行的编辑链接指向第一个请求(行)页面上的最后一个 rq:request-list。 every rq:request-list 第二行的 Edit 链接指向页面上最后一个 rq:request-list 的第二个请求(行)。等等。

我怎样才能让 {req} 指向原来的我,而不仅仅是成为过时列表中的索引?

谢谢!

【问题讨论】:

    标签: java jsf facelets custom-component custom-tag


    【解决方案1】:

    看看this blog entry,您可能会使用在构建组件树时执行一次的repeat,而不是在渲染时评估的foreach。 (但这只是在黑暗中拍摄,我没有尝试过你的例子)

    【讨论】:

    • 成功了!谢谢!我还是 Java Web 编程的新手;我认为 c:forEach 只执行了一次,而 ui:repeat 每次都执行了。但是话又说回来,这个页面不会回发给自己,所以我不明白为什么它会很重要。无论如何,它有效,所以谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2012-12-03
    相关资源
    最近更新 更多