tutorial que etiquetas espaƱol ejemplo componentes component jsf jsf-2 primefaces uicomponents

que - Buscar componente por ID en JSF



primefaces get component by id javascript (5)

Quiero encontrar algún UIComponent del bean administrado por el id que he proporcionado.

He escrito el siguiente código:

private UIComponent getUIComponent(String id) { return FacesContext.getCurrentInstance().getViewRoot().findComponent(id) ; }

He definido una p:inputTextarea como:

<p:inputTextarea id="activityDescription" value="#{adminController.activityDTO.activityDescription}" required="true" maxlength="120" autoResize="true" counter="counter" counterTemplate="{0} characters remaining." cols="80" rows="2" />

Ahora si una llamada al método como getUIComponent("activityDescription") devuelve null , pero si lo llamo getUIComponent("adminTabView:activityForm:activityDescription") entonces puedo obtener la instancia org.primefaces.component.inputtextarea.InputTextarea .

¿Hay alguna manera de obtener el componente con solo la identificación, es decir, "actividadDescripción" no la identificación absoluta, es decir, "adminTabView: activityForm: activityDescription"?


Intento este código, y es de ayuda:

private static UIComponent getUIComponentOfId(UIComponent root, String id){ if(root.getId().equals(id)){ return root; } if(root.getChildCount() > 0){ for(UIComponent subUiComponent : root.getChildren()){ UIComponent returnComponent = getUIComponentOfId(subUiComponent, id); if(returnComponent != null){ return returnComponent; } } } return null; }

Gracias


Puedes usar el siguiente código:

public UIComponent findComponent(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]; }

Este código solo encontrará el primer componente en el árbol con el id que pase. Tendrá que hacer algo personalizado si hay 2 componentes con el mismo nombre en el árbol (esto es posible si están en 2 contenedores de nombres diferentes).


Sí, en todos los componentes principales que son NamingContainers , tienes que agregar el atributo prependId="false" - prependId="false" funcionará en <h:form> y debería funcionar en otros.
Si no es posible configurarlo mediante el atributo en el archivo .xhtml, debe establecer dicho valor programáticamente.

Sugerencia después del comentario del autor de la pregunta:

Si no hay tal atributo en los componentes que está utilizando, intente escribir el método find de esta manera:

private UIComponent findComponent(String id, UIComponent where) { if (where == null) { return null; } else if (where.getId().equals(id)) { return where; } else { List<UIComponent> childrenList = where.getChildren(); if (childrenList == null || childrenList.isEmpty()) { return null; } for (UIComponent child : childrenList) { UIComponent result = null; result = findComponent(id, child); if(result != null) { return result; } return null; }

Luego solo invoque

UIComponent iamLookingFor = findComponent(myId, FacesContext.getCurrentInstance().getViewRoot());

¿Eso ayudará?


Simplemente ponga prependId="false" en su formulario en el que está este textarea.


Tal vez no es posible. El FacesContext.getCurrentInstance().getViewRoot().findComponent(id) devuelve solo un UIComponent . El ViewRoot se construye como un árbol, por lo que si tiene dos formularios en la vista, cada uno con un componente con id="text" , tendrán sus componentes principales agregados al ID para que no entren en conflicto. Si coloca los dos componentes id="text" dentro del mismo formulario, se lanzará java.lang.IllegalStateException .

Si desea encontrar todos los componentes con la identificación buscada, puede escribir un método que implemente:

List<UIComponent> foundComponents = new ArrayList(); for(UIComponent component: FacesContext.getCurrentInstance().getViewRoot().getChildren()) { if(component.getId().contains("activityDescription")){ foundComponents.add(component); } }

O si quiere encontrar la primera ocurrencia:

UIComponent foundComponent; for(UIComponent component: FacesContext.getCurrentInstance().getViewRoot().getChildren()) { if(component.getId().contains("activityDescription")){ foundComponent = component; break; } }