2012-08-23 16 views
5

Tengo un JSP 2.0 <ui:component>, dentro de eso es un <p:dataTable> con una columna que usa un compuesto para hacer un borde especial sobre cierto contenido. Ahora necesito identificar el <p:dataTabe> en un atributo ajax prestado que se encuentra en el contenido.¿Cómo acceder al contenedor de nomenclatura principal de 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> 

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

Mi idea era utilizar algo así como

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

Pero component.namingContainer.parent costuras a ser nulo.

Cuando se sustituye la <p:commandButton> con esta declaraciones:

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} 

Puedo obtener este resultado:

Parent ClientId 1: javax[email protected] 

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

Parent ClientId 4: 
Parent ClientId 5: 

no tengo idea de cuál es el problema que: mybey mi idea de identificar la lista esté completa mal o hay algún error o hay una mejor manera? (Pero no puedo utilizar fijar identifyer absoluta para el dateTable!)

Versiones: primefaces 3.2, 2.1.6 Mojarra en GlassFish 3.1.2

+1

Desafortunadamente, no uso la etiqueta 'ui: component', así que no sé mucho al respecto; Por lo general, uso componentes compilados a los que puede hacer referencia desde una expresión EL el contenedor de nombres principal como '# {cc.parent.id}'. Sin embargo, creo que 'parent' es una variable reservada en el lenguaje de expresiones EL, por lo que debe ser tan simple como' # {parent.id} 'para recuperar el identificador del contenedor padre. –

+0

@maple_shaft: '' es usado implícitamente por componentes compuestos. Por lo tanto, es más limpio declararlo directamente en lugar de ''. – BalusC

+0

¿Qué versión JSF impl/versión y PF estás usando exactamente? – BalusC

Respuesta

1

tengo una solución para este problema. Si no puede encontrar otra solución, puede usarla como alternativa. La solución es una mezcla entre jsf y javascript. Para su tabla, define un widget (por ejemplo, "myTable").

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

Se crea una variable javascript global llamada "myTable". este objeto widget contiene una identificación. Para botón de comando (h: commandButton no t: commandButton) se define 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 - se introduce el ID de forma explícita o usar mi función Jquery
actualización - myTable.id es una tabla ID (exactamente envoltorio div)
proceso - @todos, @esto, @forma, etc.

Cuestiones relacionadas