2

我正在使用渲染图像的 ui:repeat 标记。我有五张图像,我希望在每次迭代中我的图像都得到像 image1、image2、image3.... imagen 这样的 id。我试过这个,但它不工作。

<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

4 回答 4

10

您可以在属性中使用 EL id,但它必须在视图构建期间可用。然而<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>
于 2012-05-23T13:24:26.910 回答
4

不能在id属性中使用 el 表达式。它必须是静态的。它ui:repeat本身会为您的 id 生成前缀。你不需要关心唯一性。

因此,例如,如果您有一个id="image",那么生成的 id 是

somePrefix:0:image, somePrefix:1:image, ...

于 2012-05-23T06:20:02.843 回答
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

于 2012-11-21T18:43:59.367 回答
-1

只需更改<ui:repeat><c:forEach>

于 2013-09-25T16:55:03.973 回答