JSF: la identificación del niño en HtmlPanelGroup no es correcta (ignorando HtmlPanelGroupId)

Quiero agregar una etiqueta con una identificación y un campo de entrada con una identificación a un grupo de paneles (cuadro de diseño), que tiene su propia identificación. Espero que la etiqueta y el campo de entrada tengan las siguientes identificaciones: (viewid): (formid): (panelgroupid): (identificación propia) Pero de alguna manera, el panelgroupid (fachlich1) no se transmite a los niños.

<form id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3" …>
    <div id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:fachlich1">
        <label id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:label" for="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:value">Bla</label>
        <input id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:value" type="text" value="Blubb34534" name="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:value">
    </div>
</form>

¿Alguna pista de lo que podría estar haciendo mal? :(

Gracias por su ayuda!


Edit:

quiero crear mi propio componente que consiste básicamente en un div + etiqueta + texto de entrada circundante. Me extiendo desde HtmlPanelGroup y anulo el método encodeBegin, donde configuro el diseño para bloquear, establezco la identificación del panelgroup, agrego los componentes, después de lo cual llamo a super.encodeBegin:

public void encodeBeginn(FacesContext context)
{
    setLayout("block");
    setId(getId());

    HtmlOutputLabel label = new HtmlOutputLabel();
    label.setId("label");
    label.setFor("value");
    label.setValue(getLabel());
    getChildren().add(label);

    HtmlInputText text = new HtmlInputText();
    text.setId("value");
    text.setValue(getValue());
    getChildren().add(text);

    super.encodeBeginn(context)
}

preguntado el 02 de julio de 12 a las 14:07

3 Respuestas

Solo implementaciones de NamingContainer la interfaz antepondrá su propia ID a la ID de sus hijos. según el javadoc son los siguientes componentes:

Todas las clases de implementación conocidas:

HtmlDataTable, HtmlForm, UIData, UIForm, UINamingContainer

El HtmlPanelGroup, respaldado por <h:panelGroup>, no está entre ellos. En JSF estándar, solo <h:dataTable> y <h:form> Impleméntalo. En Facelets estándar, sólo <ui:repeat> lo implementa también (a través de UINamingContainer).

Esto no debería formar ningún problema técnico en absoluto. Si cree que su problema concreto (del que no dijo nada en su pregunta) es causado por esto, entonces probablemente haya encontrado la causa incorrecta y la causa de su problema concreto debe buscarse en una dirección diferente.

Respondido el 20 de junio de 20 a las 10:06

¿Tendría sentido implementar NamingContainer en mi componente? - user1323246

Usted es libre de crear uno personalizado usted mismo, el beneficio es técnicamente pero muy cuestionable. Alternativamente, también podría simplemente envolverlo en un <f:subview id="someid">. - BalusC

No estoy usando componentes compuestos. ¿Sería posible hacer esto programáticamente también? - user1323246

No, realmente necesita crear un componente personalizado. Tenga en cuenta que esto no es lo mismo que un componente compuesto. - BalusC

¿Cuál es la diferencia entre extender un componente estándar (htmlpanelgroup) y crear un componente personalizado? - user1323246

Especifique explícitamente la identificación en <h:form> y establecer prependId=false in h:form

Respondido 02 Jul 12, 14:07

Como mencionó en su comentario sobre la respuesta de BalusC, sería posible que el componente personalizado implemente NamingContainer. Intenté algo similar y dado que su componente personalizado es básicamente nada más que un componente compuesto, su HtmlPanelGroup circundante será el NamingContainer para los componentes compuestos internos.

Sin embargo, tenga cuidado y no anule getFamily con otro nombre. Esto me volvió loco hasta que descubrí que cuando haces eso, JSF no puede encontrar el renderizador estándar (el que está registrado con HtmlPanelGroup).

public class MyComponenten extends HtmlPanelGroup implements NamingContainer {

    public void encodeBeginn(FacesContext context){
        ...fill with components
        super.encodeBeginn(context);
    }
...

Respondido 03 Jul 12, 14:07

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