java jsf primefaces richfaces clientid

java - Recuperar el ID de cliente de otro componente en JSF 2.0



primefaces richfaces (3)

Dado que este fue uno de los primeros resultados de mi búsqueda en Google, me pregunté por qué obtuve un

javax.el.PropertyNotFoundException (propiedad ''itemId'' no encontrada [...])

al probar la solución aceptada, me gustaría compartir mi solución para JSF 1.2:

El método getClientId necesita un parámetro FacesContext (consulte la documentación de UIComponent ). Así que agregue un enlace al bean de respaldo y también otro método que devuelva el ID de cliente:

xhtml:

<h:button id="sampleButton" binding="#{backingBean.sampleButton}" value="Sample" /> <h:outputText value="sampleButton''s client ID : #{backingBean.sampleButtonClientId}" />

Frijol:

private UIComponent sampleButton; public UIComponent getSampleButton() { return sampleButton; } public void setSampleButton(final UIComponent sampleButton) { this.sampleButton = sampleButton; } public String getSampleButtonClientId() { final FacesContext context = FacesContext.getCurrentInstance(); return sampleButton.getClientId(context); }

Tenga en cuenta que el bean al que está vinculando su componente debe tener un ámbito de solicitud o, de lo contrario, podría terminar con una java.lang.IllegalStateException (duplicate Id for a component) (compare con este tema ).

¿Tiene JSF 2.0 un método incorporado para encontrar el ID de cliente de otro componente? Hay alrededor de mil preguntas relacionadas con la identificación del cliente en SO y hay muchos métodos fraudulentos para hacer esto, pero me pregunto si JSF 2.0 trajo un método más simple que no conozco.

#{component.clientId} evalúa a la ID de cliente propia de un componente dado, pero quiero hacer referencia a la ID de otro componente.

This publicación del blog menciona component.clientId , y también dice que #{someComponent.clientId} funciona, pero de lo que puedo decir no lo hace. Creo que él escribió que antes de que salieran todas las implementaciones de referencia de JSF 2.0, por lo que solo iba por el JSR y tal vez esa funcionalidad cambió. No estoy seguro.

Sé que PrimeFaces y RichFaces tienen sus propias funciones para devolver una ID de cliente, pero me pregunto si hay un método JSF 2.0 incorporado para esto. Aquí hay unos ejemplos:

Esto funciona para devolver el ID de outputText.

`<h:outputText value="My client ID : #{component.clientId}" />`

Según la publicación del blog anterior, esto debería funcionar, pero no lo hace. Simplemente no tengo salida.

`<h:button id="sampleButton" value="Sample" />` `<h:outputText value="sampleButton''s client ID : #{sampleButton.clientId}" />`

Esto funciona en PrimeFaces:

`<h:outputText value="PrimeFaces : sampleButton''s client ID : #{p:component(''sampleButton'')}" />`

Trabaja en RichFaces:

`<h:outputText value="RichFaces : sampleButton''s client ID : #{rich:clientId(''sampleButton'')}" />`

Además, si es posible, estoy buscando soluciones que no se rompan si cambio el valor de javax.faces.SEPARATOR_CHAR o si agrego / javax.faces.SEPARATOR_CHAR contenedores fuera de los componentes a los que se hace referencia. He pasado mucho tiempo rastreando los problemas causados ​​por las rutas de identificación codificadas.


Debe asignar al componente un nombre de variable en el ámbito de la vista mediante el atributo de binding .

<h:button id="sampleButton" binding="#{sampleButton}" value="Sample" /> <h:outputText value="sampleButton''s client ID : #{sampleButton.clientId}" />


Esto funcionó para mí. Me gustaría saber si está bien escribir una respuesta como esta.

client.html

<h:outputText value="#{UIHelper.clientId(''look-up-address-panel-id'')}" />

UIHelper.java

@ManagedBean(name = "UIHelper", eager = true) @ApplicationScoped public class UIHelper { public String clientId(final String id) { FacesContext context = FacesContext.getCurrentInstance(); UIViewRoot root = context.getViewRoot(); final UIComponent[] found = new UIComponent[1]; root.visitTree(new FullVisitContext(context), new VisitCallback() { @Override public VisitResult visit(VisitContext context, UIComponent component) { if (component.getId().equals(id)) { found[0] = component; return VisitResult.COMPLETE; } return VisitResult.ACCEPT; } }); return found[0] == null ? "" : "#" + found[0].getClientId().replace(":", "////:"); } }