Cómo generar dinámicamente una identificación en dataTable usando ui: repetir la etiqueta

Estoy usando ui: repetir la etiqueta que representa imágenes. Tengo cinco imágenes, quiero que en cada iteración mi imagen obtenga identificadores como image1, image2, image3.... imagen. Intenté esto pero no está funcionando.

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

También probé {staus.index + 1}. También probé id= image#{1++} Pero tampoco funciona. ¿Cómo puedo hacerlo?

Muchas Gracias

preguntado el 23 de mayo de 12 a las 07:05

4 Respuestas

Puede usar EL en el id atributo, pero tiene que estar disponible durante el tiempo de compilación de la vista. El <ui:repeat> sin embargo, se ejecuta durante el tiempo de procesamiento de la vista, reutilizará el mismo <p:graphicImage> para generar múltiples HTML <img> elementos. No se ejecuta durante el tiempo de compilación de la vista, por lo que el id permanece image.

Si reemplazas <ui:repeat> by <c:forEach>, entonces funcionará como usted pretendía. El <c:forEach> se ejecuta durante el tiempo de compilación de la vista y generará múltiples <p:graphicImage> componentes que luego se renderizarán solo una vez.

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

contestado el 23 de mayo de 12 a las 14:05

No puede usar las expresiones el dentro del id atributo. Tiene que ser estático. El ui:repeat en sí mismo genera un prefijo a su id. No es necesario que te preocupes por la singularidad.

Entonces, por ejemplo, si tiene un id="image", entonces los ID generados son

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

contestado el 23 de mayo de 12 a las 07:05

sí lo vi en el firebug. ¿Puedo agregar la identificación 0,1 con la imagen? ¿Te gusta que se convierta en image0, image1? Por cualquier medio . Si no es posible con el jsf, entonces con jQuery ... En realidad, quiero que cuando haga clic en una de mis imágenes, obtenga el atributo de identificación del formulario image1, image2. Aquí el índice comienza desde 0. Pero quiero estrellas de índice desde 1. Al igual que si se hace clic en la imagen somePrefix: 0: image, obtengo la id image1, en realidad estoy usando la galería de imágenes en la que necesito la clave del formulario image1, image2. Gracias - Basit

Por supuesto, podría escribir un controlador jQuery onclick que construya la cadena requerida. - mate práctico

Hhmm ok, solo quiero asegurarme de que no sea posible en el lado JSF, como usar el. Gracias :) - Basit

Pero puedes usar variables en Javascript, por ejemplo:

<h:graphicImage ... onclick="top.location.href='http://blabla.com/imageclicked?id=#{status.index}'"/>

También puede usar Variables con controladores de eventos (desde JSF 2.0):

<h:commandLink ... action="#{myBean.imageClicked(status.index)"/>

Pero tu bucle con c:forEach puede causar problemas. Tenga en cuenta que las etiquetas JSTL (todo lo que comienza con c:) no son totalmente compatibles con JSF. Si tienes suerte, entonces funcionan como se esperaba. Pero de todos modos, el motor de renderizado se ralentiza, ya que la página se procesa varias veces por el motor de renderizado JSF y JSP.

Mejor uso ui:repeat.

respondido 21 nov., 12:19

Solo cambia <ui:repeat> a <c:forEach>

Respondido el 25 de Septiembre de 13 a las 17:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.