2012-02-05 20 views
5

Estoy intentando asignar un id de ah: panelGroup dentro de una interfaz de usuario: repetir¿Cómo puedo programar una ID de h: panelGroup dentro de la interfaz de usuario: repetir

así

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}"> 

la cosa es que #{column.id} valor se está colocando correctamente dentro del valor de styleClass pero no se establece dentro del atributo id todo lo que se establece dentro del atributo id es el ID generado automáticamente por JSF + mi valor codificado "column_"

y si elimino el "column_" codificado obtengo un exce ption

java.lang.IllegalArgumentException: identificador de componente no debe ser una cadena de longitud cero en

alguna idea?

Respuesta

10

Esto no es posible con una etiqueta de tiempo de renderizado como <ui:repeat>. Sin embargo, el <ui:repeat> ya asegurará la singularidad del ID de cliente generado al anteponerlo al índice de fila. Así que simplemente elimine la parte EL del atributo ID del componente.

Con una etiqueta de tiempo de compilación de vista como <c:forEach> (que básicamente generará múltiples componentes <h:panelGroup> en lugar de solo uno que se represente varias veces), es posible especificar una ID dinámica como esa.

<c:forEach items="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}"> 

(sólo debe ser well aware de cómo funciona JSTL en Facelets)

Una alternativa es utilizar un <div> elemento estático en lugar de un <h:panelGroup layout="block"> de componentes JSF.

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <div class="#{column.id} dashboard_column" id="column_#{column.id}"> 
+0

Gracias, finalmente lo hice con div. Entonces, significa que no puedo asignar ID dinámico a elementos JSF dentro de ui: ¿repetir por mi cuenta? solo a elementos HTML simples – Daniel

+1

Eso es correcto. Los identificadores de tiempo de renderización no se pueden registrar en el árbol de componentes, tiene que ser un valor fijo en lugar de un valor dinámico. Cualquiera que sea el requisito funcional que piense resolver al abordarlo de esta manera, no sería el modo "JSF-ish" y es posible que necesite pensarlo dos veces para evitar futuras sorpresas. – BalusC

6

JSF prefije la identificación automáticamente. Si se escribe simplemente id = "columna" el código HTML generado contendrá dichos identificadores:

myForm: 0: columna myForm: 1: Columna myForm: 2: Columna

y así sucesivamente.

De todos modos: Nunca utilice etiquetas JSTL (como c: foreach y c: if) en plantillas JSF. Causan un comportamiento aleatorio, muy difícil de depurar. Y si funcionan, la ralentización de la aplicación mucho.

Use ui: repeat para bucles, y ui: fragmento para bloques condicionales. Tenga en cuenta que no hay reemplazo para c: set, tal construcción ya no existe en JSF 2.

+1

¿Por qué el voto a favor? Necesito una explicación. – xiefei

+0

Funcionó como un amuleto y fue una gran explicación.También me pregunto por qué obtuvo un voto negativo, pero voy a votar mejor ya que tiene mucho sentido. –

Cuestiones relacionadas