2012-08-23 12 views
5

Ho un JSP 2.0 <ui:component>, all'interno di questo è un <p:dataTable> con una colonna che utilizza un Composito per eseguire il rendering di un bordo speciale su alcuni contenuti. Ora ho bisogno di identificare lo <p:dataTabe> in un attributo ajax reso che si trova nel contenuto.Come accedere al contenitore di denominazione genitore di 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> 

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

La mia idea era quella di usare qualcosa come

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

Ma component.namingContainer.parent cuciture ad essere nullo.

Se si sostituisce la <p:commandButton> con questo affermazioni:

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} 

ottengo questo output:

Parent ClientId 1: javax.faces.component.html.[email protected] 

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

Parent ClientId 4: 
Parent ClientId 5: 

Non ho idea di quale sia il problema è: mybey la mia idea per identificare l'elenco è completo sbagliato o c'è qualche errore o c'è un modo migliore? (Ma io non posso usare risolvere identifyer assoluto per la dateTable!)

Versioni: primefaces 3.2, Mojarra 2.1.6 su Glassfish 3.1.2

+1

Io purtroppo non uso il tag "ui: component' quindi non ne so molto; Generalmente utilizzo Composite Components che è possibile fare riferimento da un'espressione EL al contenitore di denominazione padre come '# {cc.parent.id}'. Penso tuttavia che 'parent' sia una variabile riservata nel linguaggio delle espressioni EL, quindi dovrebbe essere semplice come' # {parent.id} 'per recuperare l'id del contenitore di denominazione genitore. –

+0

@maple_shaft: '' viene utilizzato implicitamente dai componenti compositi. È quindi più semplice dichiararlo direttamente invece di ''. – BalusC

+0

Quale versione/versione di JSF e versione PF utilizzate esattamente? – BalusC

risposta

1

ho una soluzione per questo problema. Se non riesci a trovare un'altra soluzione, puoi usarla come alternativa. La soluzione è un mix tra jsf e javascript. Per la tua tabella definisci un widget (ad esempio "myTable").

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

Si tratta di una variabile javascript globale denominata "myTable". questo oggetto widget contiene un ID. Per voi pulsante di comando (h: commandButton non p: commandButton) si definisce onklick evento:

<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 - si entra l'ID del modulo in modo esplicito o utilizzare la mia funzione Jquery
aggiornamento - myTable.id è una tabella ID (esattamente div wrapper)
processo - @all, @questo, @form ecc.