2012-08-23 12 views
5

Ich habe eine JSP 2.0 <ui:component>, in der sich eine <p:dataTable> mit einer Spalte befindet, die eine Composite verwendet, um einen speziellen Rahmen um einige Inhalte zu rendern. Nun muss ich das <p:dataTabe> in einem Ajax gerenderten Attribut identifizieren, das sich im Inhalt befindet.Zugriff auf den übergeordneten Namenscontainer von Composite?

<ui:component> 
    <p:dataTable id="dataTable" var="userItem" ... /> 
    <p:column> 

     <my:borderBox id="borderBox"> 
      <p:commandButton 
       action="#{userController.doDelete(userItem.id)}" 
       value="delete" 
       update="?????"/> <!-- How to address the dateTable? --> 
     </my:borderBox> 

     </p:column> 
    </p:dataTable> 
<ui:component> 

Mein BorderBox:

<html xmlns:composite="http://java.sun.com/jsf/composite" ...> 
    <composite:interface> 
     <composite:attribute name="styleClass" default="" type="java.lang.String"/> 
    </composite:interface> 

    <composite:implementation> 
     <h:panelGroup ...> 
     ... 
     <composite:insertChildren/> 
     </h:panelGroup> 
    </composite:implementation> 

Meine Idee war so etwas wie

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

Aber component.namingContainer.parent Nähte null zu bedienen.

Als ich die <p:commandButton> mit diesen Aussagen ersetzen:

Parent ClientId 1: #{component} 
Parent ClientId 2: #{component.namingContainer} 
Parent ClientId 3: #{component.namingContainer.clientId} 

Parent ClientId 4: #{component.namingContainer.parent} 
Parent ClientId 5: #{component.namingContainer.parent.namingContainer} 

ich diese Ausgabe:

Parent ClientId 1: [email protected]957419 

Parent ClientId 2: [email protected] 
Parent ClientId 3: main_form:profilTabView:dataTable:0:borderBox 

Parent ClientId 4: 
Parent ClientId 5: 

Ich habe keine Ahnung, was das Problem vor: dass es meine Idee mybey die Liste zu identifizieren abgeschlossen falsch oder da ein Fehler oder es gibt einen besseren Weg? (Aber ich kann absolut identifyer nicht zur dateTable verwenden fix!)

Versionen: Primeface 3.2, Mojarra 2.1.6 auf 3.1.2 Glassfish

+1

Ich benutze leider nicht 'ui: component' Tag, also weiß ich nicht viel darüber; Ich verwende normalerweise Composite Components, die Sie von einem EL-Ausdruck aus dem übergeordneten Benennungscontainer wie '# {cc.parent.id}' referenzieren können. Ich denke jedoch, dass "Eltern" eine reservierte Variable in der EL-Ausdruckssprache ist, so dass es so einfach wie '# {parent.id}' sein sollte, um die Eltern-Namenscontainer-ID zu erhalten. –

+0

@maple_shaft: '' wird implizit von Composite-Komponenten verwendet. Es ist daher sauberer, es direkt anstelle von zu deklarieren. – BalusC

+0

Welche JSF Impl/Version und PF Version verwenden Sie genau? – BalusC

Antwort

1

ich habe eine Abhilfe für dieses Problem. Wenn Sie keine andere Lösung finden, können Sie sie als Alternative verwenden. Die Lösung ist eine Mischung aus jsf und Javascript. Für Ihre Tabelle definieren Sie ein Widget (z. B. "myTable").

<p:dataTable id="dataTable" var="userItem" ... widgetVar="myTable"/> 

Es ist eine globale Javascript-Variable mit dem Namen "myTable" erstellt. Dieses Widget-Objekt enthält eine ID. Für Sie Taste Befehl (h: command nicht p: command) Sie onklick Ereignis definieren:

<h:commandButton id="deleteItem" action="#{userController.doDelete(userItem.id)}" 
value="delete" onclick="PrimeFaces.ab({formId:$(this).closest('form').attr('id'),source:this.id,process:'@all',update:myTable.id});return false;" /> 


formid - Sie die Formular-ID explizit oder benutzen meine Jquery Funktion
Update geben - myTable.id ist eine Tabelle ID (genau div wrapper)
Prozess - @all, @this, @form etc ..