web-dev-qa-db-fra.com

Obtenir l'identifiant du conteneur de nommage parent dans le modèle pour l'attribut de rendu/mise à jour

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.

17
djmj

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')}" />
48
BalusC

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

1
user2120191

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.

0
Andreas Dietrich

Essaye ça: 

<h:commandButton value="Click me">
    <f:ajax event="click" render="table" />
</h:commandButton>
0
Ventsislav Marinov

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>
0
Dmitry Trifonov