J'ai un modèle et dans sa définition, j'utilise plusieurs formulaires et boutons.
Le problème est que le fichier xhtml definition (define) ne connaît pas la hiérarchie des composants.
Et par exemple je veux mettre à jour l'élément "table2" sous une forme différente dans le même fichier de définition.
Insertion de modèle:
<p:tabView id="nav"> <!-- nav -->
<ui:insert name="content_nav">content navigation</ui:insert>
</p:tabView>
définit le premier niveau de ma hiérarchie "nav"
Modèle défini:
<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>
Dans ma partie définie, je ne veux pas savoir "nav"!
Comment puis-je faire ceci? ou comment puis-je déplacer un composant de dénomination vers le haut? ou enregistrer l'ID complet parent le plus élevé dans une variable?
parfois, j'ai vu quelque chose comme:
update=":table2"
Mais je n'ai trouvé aucune information à ce sujet?, La documentation JavaEE 6 ne mentionne que les @ mots-clés.
Moche, mais cela devrait marcher pour vous:
<p:commandButton action="..." update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2" />
Comme vous utilisez déjà PrimeFaces, une alternative consiste à utiliser #{p:component(componentId)}
. Cette fonction d'assistance analyse la totalité de la racine de la vue à la recherche d'un composant portant l'ID donné, puis renvoie son ID client:
<p:commandButton action="..." update=":#{p:component('table2')}" />
réponse moche fonctionne bien
update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2
principalement des mises à jour plus utiles du dialogue ouvert au parent datatable
En plus des solutions ci-dessus, le problème était que je devais générer dynamiquement les composants à mettre à jour (plusieurs) basés sur une logique côté serveur (avec peut-être plus difficile de trouver une imbrication).
Donc, la solution côté serveur est un équivalent à update=":#{p:component('table2')}"
1 qui utiliseorg.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
}
appelé via une autre méthode l’utilisant, par ex. comme ... update="#{foo.getCompListComputed( 'triggeringCompId' )}"
.
1: d’abord, j’ai essayé, sans trop y penser, de renvoyer public static String getCompListSpaced0() { return ":#{p:component('table2')}" ; }
dans une expression ... update="#{foo.getCompListSpaced0()}
, ce qui bien sûr (après avoir réfléchi au fonctionnement du framework :)) n’est pas résolu (renvoyé tel quel) et peut causer les problèmes que certains utilisateurs ont rencontrés. De plus, mon environnement Eclipse/JBoss Tools m'a suggéré d'écrire :#{p.component('table2')}
("." Au lieu de ":"), ce qui n'a pas aidé - bien sûr.
Essaye ça:
<h:commandButton value="Click me">
<f:ajax event="click" render="table" />
</h:commandButton>
Vous pouvez utiliser l'attribut binding
pour déclarer la variable EL liée au composant JSF. Ensuite, vous pouvez accéder à l'identifiant client absolu de ce composant à l'aide de javax.faces.component.UIComponent.getClientId()
. Voir exemple ci-dessous:
<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>