2012-01-10 71 views
7

Tengo una tabla de datos. Cada fila de la tabla tiene un commandButton llamado 'Eliminar', que se supone que elimina esa fila del modelo y la vista y realiza una actualización in situ. Como pie de página, tengo otro commandButton llamado 'Eliminar cada fila'.Datatable no se actualiza después de la exitosa llamada ajax

El último botón funciona. Hago clic en él, cada fila se elimina del modelo (es decir, ArrayList que contiene los elementos se convierte en vacío) y el dataTable y footer facet se vuelven a generar (o actualizan) en la vista.

Por otro lado, cuando hago clic en un botón de una de las filas, para eliminarlo, funciona parcialmente. El elemento correspondiente se elimina del modelo, pero la vista no se actualiza. Esa fila todavía está allí en el dataTable y el footer facet no ha cambiado.

Tengo el siguiente fragmento de código en mi users.xhtml.

<f:metadata> 
    <f:viewParam name="id" value="#{users.id}" /> 
    <f:event type="preRenderView" listener="#{users.init}" /> 
</f:metadata> 

... 

<h:form id="usersForm"> 
    <p:outputPanel>  
     <p:dataTable id="userTable" value="#{users.user.friendList}" var="friend"> 
      <p:column> 
       <h:outputText value="#{friend.name}" /> 
      </p:column> 
      <p:column> 
       <p:commandButton action="#{users.user.removeFriend(friend)}" 
        ajax="true" 
        update="userTable somethingElse" process="@this" 
        onerror="errorDialog.show();" 
        icon="ui-icon-delete" 
        title="delete user"> 
       </p:commandButton> 
      </p:column> 

      <f:facet id="somethingElse" name="footer"> 
        aye: ${users.user.xxx} 
      </f:facet> 
     </p:dataTable> 

    </p:outputPanel> 

    <p:commandButton action="#{users.user.removeAllFriends()}" ajax="true" 
       update="userTable somethingElse" 
       process="@this" 
       icon="ui-icon-close" 
       value="delete all friends?"> 
    </p:commandButton> 


</h:form> 

Entonces, ¿cuál crees que es el problema aquí?

estoy usando JSF 2.0 y 3.0 Primefaces

+0

No haga preguntas múltiples en una sola pregunta. Una pregunta por pregunta, por favor :) He editado la otra pregunta. Además, la pregunta anterior vinculada no está relacionada en absoluto. Es tal vez el mismo código, pero el problema no es el mismo. En cuanto a su problema actual: ¿qué versión de PF está usando? ¿Qué pasa si usas 'update =" @ form "' en su lugar? – BalusC

+0

Perdón por las malas palabras, pero muchas gracias, una vez más :) Sobre múltiples preguntas, intentaré hacerlo lo mejor posible la próxima vez :) –

+0

Lo volví a publicar como una respuesta :) – BalusC

Respuesta

11

reconozco esta forma uno de nuestros problemas actuales PF 3.0 páginas. Funcionará si usa update="@form" en su lugar. Realmente no he tenido tiempo de investigar la causa real para poder informarlo a los chicos de PF, porque este problema no se manifiesta en todas las páginas. Incluso en la misma tabla, un botón diferente funciona como intentado.

darle una oportunidad:

<p:commandButton update="@form" ... /> 

actualización: llegar a pensar en ello, tal vez se relaciona con la presencia de process="@this".

+0

Me gusta más tu respuesta porque es mucho más eficiente y limpia. Me pregunto si esta solución también funcionará para las aplicaciones que se ejecutan en Primefaces 2.2.1. Tendré que probar esto y descubrir cuándo tengo más tiempo. –

+0

Tengo un proyecto existente en PF 3.2 y esto sigue siendo un problema. ¿Alguien sabe si se ha solucionado en una versión posterior? – Catfish

+0

@Catfish: esto ha sido reconocido y corregido en PF 3.4: http://stackoverflow.com/questions/12516397/how-to-ajax-update-the-pdatatable-from-inside-the-pdatatable-itself/12517181# 12517181 – BalusC

1

Usted probablemente está utilizando Primefaces 2.2.1 como esto parece que se debe a un error común con los Primefaces componente dataTable. Esencialmente, lo que ocurre es que las devoluciones de datos ajax que ocurren dentro de los elementos de una tabla de datos no darán como resultado una actualización parcial de la página de los elementos en la tabla de datos.

La solución más simple es invocar una devolución de datos desde un botón fuera de la tabla de datos donde su único propósito es simplemente actualizar la tabla de datos en una página parcial. Esta no es la solución más eficiente, ya que da como resultado dos devoluciones, sin embargo, funciona.

Véase mi respuesta anterior a este problema Here

+0

En realidad estoy usando Primefaces 3.0. ¿También tiene este error? –

+0

Tenía la impresión de que esto se había solucionado en 3.0, pero no he estado usando 3.0 desde hace tanto tiempo para haber topado con esto todavía. –

+0

Muy bien, gracias por la respuesta! –

1

Si desea utilizar identificadores de servidor para actualizar componentes (como userTable, somethingElse, ...), estos componentes deben estar en el mismo contenedor de nombres que el componente que desencadena la actualización (su botón, por ejemplo). De lo contrario, debe usar una expresión como esta dentro del atributo de actualización: update=":usersForm:userTable".

El problema principal es identificar los contenedores de nombres. El botón externo funciona, porque está en el mismo contenedor de nombres (el formulario) que la tabla con el ID userTable.La faceta se actualiza porque toda la tabla se actualiza, pero dado que datatable es un contenedor de nombres, debe no ser posible actualizar el pie de página simplemente usando update="somethingElse" en el botón externo.

No estoy seguro, por qué el botón interno no funciona. Supongo que hay otro contenedor de nombres dentro de la tabla de datos. PrimeFaces registra una INFO, si el componente no se pudo encontrar utilizando el algoritmo findComponent de la implementación UIComponent. INFO: Cannot find component with identifier "userTable" in view.

0

Esta es la solución para refrescar en JSF 2,0

<p:dataTable id="empl1" var="emp" value="#{dtEmployeeView.employee}" selectionMode="multiple" rowKey="#{emp.id}" 
           paginator="true" rows="5" tableStyleClass="ui-table-columntoggle"> 
    <p:column width="20" headerText="Id" priority="1"> 
     <h:link value="#{emp.id}" /> 
    </p:column> 
    <p:column headerText="Employee Name" priority="2"> 
     <h:outputText value="#{emp.pname}" /> 
    </p:column> 

</p:dataTable> 
<p:commandButton update="form1:empl1" ajax="true" value="Submit" action="#{empService.addEmployee(employee)}" > 
    <f:event type="preRenderView" listener="#{dtEmployeeView.init()}"/> 
</p:commandButton> 
0

tuve filtros en mi tabla de datos. Así que aquí resolví el problema con

oncomplete="PF('myWidgetVar').filter()" and update="@form" 
Cuestiones relacionadas