为什么我的Facelets循环变量不会超出范围?

时间:2009-07-15 23:13:25

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

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

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

rq:请求列表就像你期望的那样开始:

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

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

<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>

在将支持bean中的请求设置为我们所在的表行所代表的请求之后,将我们带到编辑页面。这就是问题所在。它很微妙。

rq:请求列表在一个页面中多次使用;就这样:

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

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

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

如何让{req}指出它是什么,而不仅仅是过时的列表中的索引?

谢谢!

1 个答案:

答案 0 :(得分:1)

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