jsf-2 - example - jsf ejemplo
Obtenga el ID del contenedor de nombres de los padres en la plantilla para el atributo de render/actualización (5)
Tengo una plantilla y en su definición utilizo varios formularios y botones.
El problema es que la definición (definir) del archivo xhtml no conoce la jerarquía de componentes.
Y, por ejemplo, quiero actualizar el elemento "table2" en una forma diferente en el mismo archivo de definición.
Insertar Plantilla:
<p:tabView id="nav"> <!-- nav -->
<ui:insert name="content_nav">content navigation</ui:insert>
</p:tabView>
define el primer nivel de mi jerarquía "nav"
Plantilla de definir:
<ui:define name="content_nav">
<h:form id="form1"> <!-- nav:form1 -->
<h:dataTable id="table1"/> <!-- nav:form1:table1 -->
<p:inputText value="#{bean.value}"/>
<p:commandButton action="..." update="nav:form2:table2"/>
</h:form>
<h:form id="form2">
<h:dataTable id="table2"/> <!-- nav:form2:table2 -->
<!-- other elements -->
</h:form>
</ui:define>
En mi parte de definir no quiero saber "nav"!
¿Cómo puedo hacer esto? o ¿cómo puedo mover un componente de nomenclatura hacia arriba, o guardar la identificación completa principal superior en una variable?
a veces vi algo como:
update=":table2"
Pero no pude encontrar ninguna información sobre esto, la documentación de JavaEE 6 simplemente menciona las palabras clave @.
Además de las soluciones anteriores, tuve el problema, que tenía que generar dinámicamente los componentes a ser actualizados (muchos) basados en la lógica del lado del servidor (con tal vez más difícil de encontrar el anidamiento).
Así que la solución en el lado del servidor es equivalente a update=":#{p:component(''table2'')}"
1 que usa org.primefaces.util.ComponentUtils.findComponentClientId( String designId )
:
// UiPnlSubId is an enum containing all the ids used within the webapp xhtml.
// It could easily be substituted by a string list or similar.
public static String getCompListSpaced( List< UiPnlSubId > compIds ) {
if ( compIds == null || compIds.isEmpty() )
return "" ;
StringBuffer sb = new StringBuffer( ":" ) ;
for ( UiPnlSubId cid : compIds )
sb.append( ComponentUtils.findComponentClientId( cid.name() ) ).append( " " ) ;
return sb.deleteCharAt( sb.length() - 1 ).toString() ; // delete suffixed space
}
se llama a través de algún otro método que lo usa, por ejemplo, como ... update="#{foo.getCompListComputed( ''triggeringCompId'' )}"
.
1 : primero intenté sin pensar demasiado en devolver public static String getCompListSpaced0() { return ":#{p:component(''table2'')}" ; }
public static String getCompListSpaced0() { return ":#{p:component(''table2'')}" ; }
en una ... update="#{foo.getCompListSpaced0()}
expresión, que por supuesto (después de pensar en cómo funciona el marco :)) no se resuelve (se devuelve como está) y puede causar problemas con algunos usuarios También mi entorno de Eclipse / JBoss Tools sugirió escribir :#{p.component(''table2'')}
("." en lugar de ":") que no ayudó, por supuesto.
Feo, pero esto debería funcionar para ti:
<p:commandButton action="..." update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2" />
Como ya está usando PrimeFaces, una alternativa es usar #{p:component(componentId)}
, esta función auxiliar escanea la raíz de la vista completa en busca de un componente con el ID dado y luego devuelve su ID de cliente:
<p:commandButton action="..." update=":#{p:component(''table2'')}" />
Prueba esto:
<h:commandButton value="Click me">
<f:ajax event="click" render="table" />
</h:commandButton>
Puede usar el atributo de binding
para declarar la variable EL vinculada al componente JSF. Luego, puede acceder al ID de cliente absoluto de este componente utilizando javax.faces.component.UIComponent.getClientId()
. Vea el ejemplo a continuación:
<t:selectOneRadio
id="yourId"
layout="spread"
value="#{yourBean.value}"
binding="#{yourIdComponent}">
<f:selectItems value="#{someBean.values}" />
</t:selectOneRadio>
<h:outputText>
<t:radio for=":#{yourIdComponent.clientId}" index="0" />
</h:outputText>
respuesta fea funciona bien
update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2
Principalmente la actualización es más útil desde el diálogo abierto al padre de datos.