我正在使用ui:repeat标记来渲染图像。我有五个图像,我想在每次迭代时,我的图像得到ID像image1,image2,image3 .... imagen。我试过了,但它没有用。
<div id="imageGallery">
<ui:repeat value="#{countryPages_Setup.images}" var="image" varStatus="status">
<tr>
<td>
<a href="javascript:void()" class="launchLink">
<p:graphicImage id="image#{status.index}" //problem
value="/resources/images/#{image}"
width="100"
height="100"
rendered="#{countryPages_Setup.renderImages}"/>
</a>
</td>
</tr>
</ui:repeat>
</div>
我也试过{staus.index + 1}。我也试过id = image#{1 ++}但它也没有用。我该怎么办?
由于
答案 0 :(得分:10)
您可以在id
属性中使用EL,但必须在视图构建期间使用它。然而,<ui:repeat>
在视图渲染时运行,它将重用相同的<p:graphicImage>
来生成多个HTML <img>
元素。它在视图构建期间不运行,因此id
仍为image
。
如果您将<ui:repeat>
替换为<c:forEach>
,那么它将按您的意图运作。 <c:forEach>
在视图构建期间运行,它将生成多个<p:graphicImage>
组件,然后每个组件只渲染一次。
<div id="imageGallery">
<c:forEach items="#{countryPages_Setup.images}" var="image" varStatus="status">
<tr>
<td>
<a href="javascript:void()" class="launchLink">
<p:graphicImage id="image#{status.index}"
name="images/#{image}"
width="100"
height="100"
rendered="#{countryPages_Setup.renderImages}"/>
</a>
</td>
</tr>
</c:forEach>
</div>
答案 1 :(得分:4)
您不能在id
属性中使用el表达式。它需要是静态的。 ui:repeat
本身会为您的ID生成前缀。你不需要关心唯一性。
因此,例如,如果您有id="image"
,则生成的ID为
somePrefix:0:image
,somePrefix:1:image
,...
答案 2 :(得分:2)
但您可以在Javascript中使用变量,例如:
<h:graphicImage ... onclick="top.location.href='http://blabla.com/imageclicked?id=#{status.index}'"/>
您还可以将变量与事件处理程序一起使用(因为JSF 2.0):
<h:commandLink ... action="#{myBean.imageClicked(status.index)"/>
但是使用c:forEach
的循环可能会导致问题。请注意,JSTL标记(以c:
开头的所有内容)与JSF不完全兼容。如果你有运气,那么它们按预期工作。但无论如何,渲染引擎的速度变慢,因为JSF和JSP渲染引擎会多次处理页面。
更好地使用ui:repeat
。
答案 3 :(得分:-1)
只需将<ui:repeat>
更改为<c:forEach>