成功的Ajax调用后Datatable不会更新

问题描述:

我有一个数据表。表中的每一行都有一个commandButton,称为'删除',它应该从模型和视图中删除该行并就地执行更新。作为页脚,我还有另一个commandButton,名为'删除每行'成功的Ajax调用后Datatable不会更新

最后一个按钮的作品。我点击它,每行都从模型中删除(即包含元素的ArrayList变为空),并且dataTablefooter facet在视图中被重新渲染(或更新)。

另一方面,当我单击其中一行上的按钮时,将其删除,它会部分工作。相应的元素将从模型中删除,但视图不会更新。该行仍然存在于dataTablefooter facet未更改。我的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> 

那么,你认为这里的问题是什么?

我3.0

+0

不要在一个问题中提出多个问题。每个问题的一个问题,请:)我已经编辑了另一个问题。此外,关联的前一个问题根本就没有关系。也许是相同的代码,但问题是绝对不一样的。至于你目前的问题:你使用的是哪个PF版本?如果你使用'update =“@ form”'而不是? – BalusC 2012-01-10 12:51:50

+0

对不起,但非常感谢你,再次:)关于多个问题,我会尽力在下次:) – 2012-01-10 13:12:42

+0

我转发它为答案:) – BalusC 2012-01-10 13:15:44

我认识到这个问题的形式我们当前的PF 3.0页面。如果您使用update="@form",它将起作用。我没有真正的时间来调查真正的原因,以便我可以向PF伙伴报告,因为这个问题并没有在所有页面中显示。即使在同一张桌子上,不同的按钮也可以按照默认的方式工作。

试试看:

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

更新:来想想,它可能涉及到的process="@this"存在。

+0

我更喜欢你的答案,因为它更加高效和干净。我想知道此修补程序是否也适用于在Primefaces 2.2.1上运行的应用程序?我将不得不对此进行测试,并了解何时我有更多时间。 – 2012-01-10 13:24:43

+0

我有一个PF 3.2中的现有项目,这仍然是一个问题。有谁知道它是否已在更高版本中修复? – Catfish 2012-10-15 19:57:05

+0

@Catfish:这已经在PF 3.4中得到确认和修复:http://*.com/questions/12516397/how-to-ajax-update-the-pdatatable-from-inside-the-pdatatable-itself/12517181# 12517181 – BalusC 2012-10-15 20:03:51

您可能正在使用Primefaces 2.2.1,因为这似乎是由于与Primefaces dataTable组件一个共同的错误使用JSF 2.0和Primefaces。本质上发生的是,从dataTable的元素中发生的ajax回发不会导致dataTable中元素的部分页面更新。

最简单的解决方法是从dataTable之外的按钮调用回发,其唯一目的仅仅是部分页面更新dataTable。这不是最有效的解决方案,因为它会导致两次回发,但它确实有效。

见我以前回答这个问题Here

+0

我实际上使用Primefaces 3.0。它也有这个bug吗? – 2012-01-10 13:11:14

+0

这是我的印象,这是固定在3.0但是我还没有使用3.0,已经遇到了这个呢。 – 2012-01-10 13:23:35

+0

好的,谢谢你的回答! – 2012-01-10 13:30:50

如果要使用服务器ID更新组件(如userTable,somethingElse,...),这些组件必须与触发更新的组件(例如,您的按钮)位于同一个命名容器中。否则,您需要在update属性中使用像这样的表达式:update=":usersForm:userTable"

主要问题是确定命名容器。外部按钮可以工作,因为它与ID为userTable的表位于同一个命名容器(表单)中。由于整个表得到更新,方面得到更新,但由于datatable本身就是一个命名容器,它应该可以通过在外部按钮上使用update="somethingElse"来更新页脚而不是

我不确定,为什么内部按钮不起作用。我想在数据表中还有另一个命名容器。如果使用UIComponent实现的findComponent算法无法找到组件,PrimeFaces会记录INFO。 INFO: Cannot find component with identifier "userTable" in view.

这是解决在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> 

我有过滤器在我的数据表进行刷新。所以我在这里解决了这个问题

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