Evitar identificadores duplicados al reutilizar composiciones de facelets en el mismo contenedor de nombres

Tengo una que contiene algunos elementos con identificadores explícitos y algunos eventos ajax que hacen referencia a estos identificadores para procesamiento / actualización parcial. Encapsulé este fragmento de xhtml dentro de la composición simplemente para poder usarlo en algunos lugares diferentes sin tener que duplicar el código. Sin embargo, cuando uso la composición (con ) más de una vez dentro de una página, obtengo excepciones de identificación duplicadas. Parece que JSF no está envolviendo cada composición dentro de su propio contenedor de nombres (como does).

¿Hay una manera simple de envolver mi composición dentro de su propio contenedor de nombres? ¿O tengo que usar un componente compuesto cada vez que quiero reutilizar fragmentos xhtml dentro de un contenedor de nombres común?

Según el propósito de la plantilla , tiene varias opciones:

  1. Use . Crea otro contexto de NamingContainer (como , , y todos los amigos lo hacen):

        ...    

    Los componentes some.xhtml en some.xhtml terminarán obteniendo respectivamente top: y bottom: prefix en su ID.


  2. Convertirlo en un archivo de etiqueta que requiere un atributo id .

      ...  

    Y use esa identificación para anteponer la identificación de los componentes en la composición.

      ...   ...  

  3. Convertirlo en un componente compuesto . Los componentes compuestos ya son intrínsecamente un NamingContainer , por lo que su atributo id es opcional. Básicamente, reemplace

      ...  

    por

          ...   ...   

    De esta forma puedes usarlo de la siguiente manera:

      ...  

    Los componentes definidos en terminarán obteniendo respectivamente top: y bottom: prefix en su ID (nota nuevamente, el atributo id del componente compuesto es opcional, de lo contrario JSF autogenerará uno).


Ver también:

  • Cuándo usar , archivos de tags, componentes compuestos y / o componentes personalizados?

Cuando incluye más de una vez la misma ui:composition la identificación está duplicada. La solución es especificar un ui:param particular dentro de la ui:include .

Suponiendo que esté incluyendo mycomposition.xhtml, puede hacer algo similar:

    ...    

Luego en mycomposition.xhtml debes declarar los id como sigue (por ejemplo ah: outputText):

  

Ahora puede hacer referencia a la identificación en el rest de su página como #{idPrefix}_text .