如何使用ui:repeat标签在dataTable中动态生成id

时间:2012-05-23 06:14:19

标签: jsf-2 el

我正在使用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 ++}但它也没有用。我该怎么办?

由于

4 个答案:

答案 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:imagesomePrefix: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>

即可