wake-up-neo.com

Rufen Sie die ID des übergeordneten Namenscontainers in der Vorlage für das Render-/Update-Attribut ab

Ich habe eine Vorlage und in ihrer Definition verwende ich verschiedene Formulare und Schaltflächen.

Das Problem ist, dass die xhtml-Datei definition (define) die Komponentenhierarchie nicht kennt.

Und zum Beispiel möchte ich das Element "table2" in einer anderen Form in derselben Definitionsdatei aktualisieren.

Vorlage einfügen:

<p:tabView id="nav"> <!-- nav -->
    <ui:insert name="content_nav">content navigation</ui:insert>
</p:tabView>

definiert die erste Ebene meiner Hierarchie "nav"

Vorlage definieren:

<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>

In meinem Definitionsteil möchte ich nicht "nav" wissen!

Wie kann ich das machen? oder wie kann ich eine Namenskomponente nach oben verschieben? oder die oberste vollständige ID in einer Variablen speichern?

manchmal sah ich so etwas wie:

update=":table2"

Ich konnte aber keine Informationen dazu finden ?, die JavaEE 6-Dokumentation erwähnt nur die @ -Hwortwörter.

17
djmj

Hässlich, aber das sollte für Sie klappen:

<p:commandButton action="..." update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2" />

Da Sie bereits PrimeFaces verwenden, können Sie #{p:component(componentId)} verwenden. Diese Hilfsfunktion durchsucht den gesamten View-Root nach einer Komponente mit der angegebenen ID und gibt dann deren Client-ID zurück:

<p:commandButton action="..." update=":#{p:component('table2')}" />
48
BalusC

hässliche Antwort funktioniert gut

update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2

hauptsächlich nützlichere Aktualisierungen vom geöffneten Dialog zur übergeordneten Datentabelle

1
user2120191

Zusätzlich zu den obigen Lösungen hatte ich das Problem, dass ich die zu aktualisierenden Komponenten (viele) basierend auf serverseitiger Logik dynamisch generieren musste (wobei die Verschachtelung möglicherweise schwieriger zu ermitteln ist).

Die Lösung auf der Serverseite ist also ein äquivalent zu update=":#{p:component('table2')}"1 welche verwendetorg.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
}

über eine andere Methode aufgerufen, z. wie ... update="#{foo.getCompListComputed( 'triggeringCompId' )}".

1: zuerst habe ich versucht, ohne zu viel nachzudenken, public static String getCompListSpaced0() { return ":#{p:component('table2')}" ; } in einem ... update="#{foo.getCompListSpaced0()}-Ausdruck zurückzugeben, was natürlich (nachdem ich darüber nachgedacht habe, wie das Framework funktioniert :)) nicht aufgelöst wird (zurückgegeben wird, wie es ist) und die Probleme verursachen kann, die einige Benutzer erlebt haben. Auch meine Eclipse/JBoss Tools-Umgebung schlug vor, :#{p.component('table2')} ("." Anstelle von ":") zu schreiben, was natürlich nicht geholfen hat.

0

Versuche dies: 

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

Sie können das binding-Attribut verwenden, um die an die JSF-Komponente gebundene EL-Variable zu deklarieren. Dann können Sie mit javax.faces.component.UIComponent.getClientId() auf die absolute Client-ID dieser Komponente zugreifen. Siehe Beispiel unten:

<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