2010-07-29 9 views
6

Quiero elegir dinámicamente un facelet para representar algún elemento en mi lista de datos. El primer intento sería:ui dinámico: incluir dentro de ui: repetir. ¿Hay una solución simple?

 
<ui:repeat value="#{panels}" var="panel"> 
    <ui:include src="#{panel.facelet}"> 
</ui:repeat> 

Pero no va a trabajar desde el src de ui: include se evalúa demasiado pronto. La información de facelet es realmente dinámica, por lo que no puedo usar c: forEach (tampoco es realmente recomendable mezclarlo con facelets). Supongo que todo se reduce a encontrar una interfaz de usuario basada en componentes: incluir una alternativa.

¿Existe tal cosa o tengo que escribir la mía?

+0

Continuamos luchando con este mismo problema durante años. Me pregunto si es mrembisz alguna vez encontró una mejor solución con JSF 2?Si no, ¿podría compartir su solución personalizada? – cyberoblivion

+0

@cyberoblivion hemos implementado nuestro propio componente de inclusión y adaptado UIRepeat para trabajar con él, principalmente para permitir múltiples niveles de anidación. Todavía funciona en nuestros sistemas de producción. Pero nos alejamos de JSF de todos modos. – mrembisz

+0

por lo que la solución no es algo que sería útil para nadie más o tiene prohibido compartir el código? Estoy muy interesado en el código. – cyberoblivion

Respuesta

2

c: forEach lo resolverá, ¿por qué no puedes usarlo?

artículo interesante con respecto a esa cuestión: http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets

+0

Gracias pero c: forEach se evalúa una vez, cuando se construye la vista. En mi caso, lo que está bajo # {panels} puede cambiar mientras el usuario interactúa con la página. – mrembisz

+0

Marcando esto como una respuesta: no funcionará para mí principalmente debido al impacto en el rendimiento, pero estará bien para la mayoría. Usando la dinámica personalizada incluye por ahora. – mrembisz

0

Recuerdo tratando de hacer algo similar con una etiqueta personalizada y FaceletHandler etc. Al final todos los pequeños problemas de tiempo de renderizado hacen que no vale la pena el esfuerzo. Cuenta de que estaba (y sigue un: - (...) usando facelets para JSF 1.1, así que no sé si esto es mejor en las versiones posteriores

Cómo dinámico/cuántos facelets diferente es lo que tiene que hacerlo. tratar? La razón que pido es que se puede (para emplear un término de los magos del compilador) desenrollar el bucle. en lugar de

<ui:repeat value="#{panels}" var="panel"> 
    <ui:include src="#{panel.facelet}"> 
</ui:repeat> 

que podría hacer

<custom:panelOneFacelet rendered="#{hasPanel1}" /> 
<custom:panelTwoFacelet rendered="#{hasPanel2}" /> 
<!-- etc... --> 

Y en su facelet, se tendría algo como:

<c:if test="#rendered" > 
    <!-- EVERYTHING IN THE FACELET HERE!!!--> 
</c:if> 

Este tipo de enfoque baja tecnología está muy bien para un pequeño conjunto controlado, pero si usted tiene un conjunto muy grande y variable de facelets esto puede no funcionar.

¿Puedo preguntar por qué, b/c veces con una comprensión de alto nivel, SO gurús pueden sugerir ideas mucho más simples para lograr el mismo objetivo

+0

Básicamente rendimos un formulario comercial que se nos proporciona como un árbol de campos de datos. Lo que describiste aquí fue nuestro primer intento, pero resultó ser muy costoso ya que en cada nodo teníamos un conjunto completo de posibles opciones de representación. Terminamos implementando nuestro propio componente include tag + que funciona bien, pero que es un verdadero problema mantener debido a la complejidad y el funcionamiento interno de jsf. Hicimos esto hace casi 3 años y ahora planeamos pasar a jsf2. Esperaba que apareciera una alternativa lista para usar en este momento. – mrembisz

+0

Hmmm ... no estoy seguro de entender ... por lo que tiene como Biblioteca {ubicación, nombre, Lista libros} donde Libro {nombre, isbn, Autor} donde Autor {nombre, edad, ..} ¿Algo así? ¿Y le gustaría obtener ese tipo de estructura para generar un árbol de campos de formas? ... Debo tener esto mal, ¿eh? .. Esto me parece demasiado complejo, lo rompería todo con diferentes formas y frijoles etc ... –

+0

Lo tienes bien, esto es exactamente lo que tenemos y no conocemos la estructura del registro hasta el tiempo de ejecución. Como dije, tenemos una solución funcional pero bastante compleja. Me gustaría investigar la posibilidad de eliminar nuestra lógica de jsf personalizada. – mrembisz

4

creo que me he dado cuenta que relativamente sencilla solución que has estado buscando

Yo también comencé con un ui: incluir dentro de un ui: repetir como el suyo, pero acepté que tenía que usar ac: forEach, y el c: forEach funcionó muy bien para obtener dinámicamente un conjunto diferente de xhtml/components para incluir incluso con la interacción del usuario cambiando cosas en la Vista como creo que tienes. Se veía así:

<c:forEach var="thing" items="#{view.things}"> 
     <ui:include src="#{thing.renderComponent}"> 
      <ui:param name="thing" value="#{thing}"/> 
     </ui:include> 
</c:forEach> 

Sin embargo, mi ui: param no estaba funcionando - todos los componentes Incluí la aprobación de la misma "cosa"/Objeto pesar de que había utilizado con éxito diversas cosas/objetos que se incluirán de forma dinámica diferente componentes.

Fue entonces cuando encontré la publicación this que me inspiró a envolver mi interfaz de usuario: incluir en una subvista f :. Y ahora todo está funcionando bien con el siguiente código:

<c:forEach var="thing" items="#{view.things}" varStatus="loop"> 
    <f:subview id="thing_#{loop.index}"> 
     <ui:include src="#{thing.renderComponent}"> 
      <ui:param name="thing" value="#{thing}"/> 
     </ui:include> 
    </f:subview> 
</c:forEach> 
+1

¡Gracias, amigo! f: ¡la subvista fue la respuesta para mí! – hbobenicio

Cuestiones relacionadas