2012-08-23 10 views
5

Mam JSP 2.0 <ui:component>, w tym jest <p:dataTable> z kolumną, która używa złożonego do renderowania specjalnej granicy o niektórych treści. Teraz muszę zidentyfikować <p:dataTabe> w atrybucie renderowanym ajax, który znajduje się w treści.Jak uzyskać dostęp do nadrzędnego kontenera nazewnictwa złożonego?

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

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

Mój pomysł był użyć czegoś jak

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

Ale component.namingContainer.parent szwach być zerowa.

Kiedy wymienić <p:commandButton> z tym oświadczenia:

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} 

uzyskać ten wynik:

Parent ClientId 1: [email protected] 

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

Parent ClientId 4: 
Parent ClientId 5: 

nie mam pojęcia, na czym polega problem to: mybey mój pomysł, aby zidentyfikować lista jest kompletna źle czy jest jakiś błąd, czy jest lepszy sposób? (Ale nie mogę użyć naprawić absolutną identifyer dla dateTable!)

Wersje: Primeface 3.2, Mojarra 2.1.6 na GlassFish 3.1.2

+1

Niestety nie używam znacznika 'ui: component', więc nie wiem zbyt wiele na ten temat; Zazwyczaj używam Komponentów Kompozytowych, z których można odwołać się za pomocą wyrażenia EL, rodzicielskiego kontenera nazw, takiego jak '# {cc.parent.id}'. Myślę jednak, że 'parent' jest zmienną zarezerwowaną w języku wyrażeń EL, więc powinno być tak proste, jak' # {parent.id} ', aby powrócić do nadrzędnego identyfikatora kontenera nazw. –

+0

@maple_shaft: '' jest niejawnie używane przez komponenty kompozytowe. Dlatego czystszym jest deklarowanie go bezpośrednio zamiast "". – BalusC

+0

Którą wersję JSF impl/version i PF dokładnie używasz? – BalusC

Odpowiedz

1

mam obejście tego problemu. Jeśli nie możesz znaleźć innego rozwiązania, możesz użyć go jako alternatywy. Rozwiązanie to połączenie jsf i javascript. Dla swojej tabeli definiujesz widżet (np. "MyTable").

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

Jest to globalna zmienna javascript o nazwie "myTable". ten obiekt widgetu zawiera identyfikator. Ci przycisku polecenia (h: CommandButton nie p: CommandButton) zdefiniować onklick zdarzenie:

<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 - wpisać identyfikator formularza bezpośrednio lub używać funkcji jQuery
update - myTable.id jest stołowy ID (dokładnie div wrapper)
proces - @all, @this, @form itd ..

Powiązane problemy