2012-08-01 39 views
0

我正在使用JSF 2.0的repeat标记遍历对象列表并显示其某些属性。我想使用repeatvarStatus属性,以便我可以访问循环索引,最后一个列表项的编号,并确定是否已到达列表的末尾(因此不会显示间隔符)。我认为这会工作:无法使用JSF 2.0重复标记的“结束”属性varStatus

<ui:repeat var="anObject" varStatus="repeatStatus" value="#{objectList}"> 
    <h:panelGroup> 
     <h:outputText value="Item #{repeatStatus.index + 1} of #{repeatStatus.end}" /> 
     <h:outputText value="#{anObject.text}" /> 
    </h:panelGroup> 

    <h:outputText value="&nbsp;" rendered="#{false == repeatStatus.last}" /> 
</ui:repeat> 

但是,它从来没有显示任何repeatStatus.endindexlast属性运行良好。

而不是repeatStatus.end,我尝试使用objectList.size(),但只为列表中的第一项工作。

如何显示列表中项目的数量作为“y的项目x”文本的一部分?

回答

2

仅当您设置size属性时才会使用end

<ui:repeat ... size="#{fn:length(objectList)}"> 

或者,你也可以只直接使用它。

Item #{repeatStatus.index + 1} of #{fn:length(objectList)} 

顺便说一下,#{false == repeatStatus.last}的布尔比较是丑陋的。它已经返回一个布尔值;如果你想否定它,宁可使用#{not repeatStatus.last}

+0

这很有道理。但是,在这个项目中,我试图避免使用JSTL。 根据你的建议,我尝试了'size =“#{objectList.size()}”',但那没有效果。 – 2012-08-01 20:28:02

+0

然后创建一个自定义EL功能。然而,我不明白这比仅仅使用现有的JSTL功能更好。也许你已经过度概括了其中的一个,“在JSF中避免使用JSTL”。阅读这个问题然后:http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense至于'.size()',只有当你的环境使用EL 2.2或JBoss EL时才有效。 – BalusC 2012-08-01 20:44:57

+0

尽管我还没有为我工作,但我已经标记了您的答案。我从来没有见过你的解决方案不起作用。 :)我是一个Java新手,所以我不知道为什么它不工作,但我会弄清楚。我验证了你对'size'属性的评论。如果我在那里放一个数字,'repeatStatus.end'确实显示这个数字。我开始认为JSTL没有工作,但后来我尝试了'fn:toUpperCase'并且工作正常。我认为'objectList'的评估是错误的。我以前遇到过这个问题,但我认为我需要提出另一个问题。 – 2012-08-03 19:23:31