成功的Ajax调用后Datatable不会更新
我有一个数据表。表中的每一行都有一个commandButton
,称为'删除',它应该从模型和视图中删除该行并就地执行更新。作为页脚,我还有另一个commandButton
,名为'删除每行'。成功的Ajax调用后Datatable不会更新
最后一个按钮的作品。我点击它,每行都从模型中删除(即包含元素的ArrayList
变为空),并且dataTable
和footer facet
在视图中被重新渲染(或更新)。
另一方面,当我单击其中一行上的按钮时,将其删除,它会部分工作。相应的元素将从模型中删除,但视图不会更新。该行仍然存在于dataTable
和footer 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
我认识到这个问题的形式我们当前的PF 3.0页面。如果您使用update="@form"
,它将起作用。我没有真正的时间来调查真正的原因,以便我可以向PF伙伴报告,因为这个问题并没有在所有页面中显示。即使在同一张桌子上,不同的按钮也可以按照默认的方式工作。
试试看:
<p:commandButton update="@form" ... />
更新:来想想,它可能涉及到的process="@this"
存在。
我更喜欢你的答案,因为它更加高效和干净。我想知道此修补程序是否也适用于在Primefaces 2.2.1上运行的应用程序?我将不得不对此进行测试,并了解何时我有更多时间。 – 2012-01-10 13:24:43
我有一个PF 3.2中的现有项目,这仍然是一个问题。有谁知道它是否已在更高版本中修复? – Catfish 2012-10-15 19:57:05
@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
我实际上使用Primefaces 3.0。它也有这个bug吗? – 2012-01-10 13:11:14
这是我的印象,这是固定在3.0但是我还没有使用3.0,已经遇到了这个呢。 – 2012-01-10 13:23:35
好的,谢谢你的回答! – 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"
不要在一个问题中提出多个问题。每个问题的一个问题,请:)我已经编辑了另一个问题。此外,关联的前一个问题根本就没有关系。也许是相同的代码,但问题是绝对不一样的。至于你目前的问题:你使用的是哪个PF版本?如果你使用'update =“@ form”'而不是? – BalusC 2012-01-10 12:51:50
对不起,但非常感谢你,再次:)关于多个问题,我会尽力在下次:) – 2012-01-10 13:12:42
我转发它为答案:) – BalusC 2012-01-10 13:15:44