【问题标题】:Ajax update doesn't work, when using filter on p:dataTable在 p:dataTable 上使用过滤器时,Ajax 更新不起作用
【发布时间】:2012-12-29 16:14:28
【问题描述】:

我有一个包含 primefaces 过滤器功能的数据表。可以对表进行一些操作(例如编辑)。用户使用 ajax 操作完成后数据表会更新。 如果我不过滤数据表,它直接更新表格并且效果很好,不幸的是,如果我使用它并编辑它。

这就是我的数据表的样子:

    <p:dataTable id="dataTable" var="row"
                value="#{bean.value}"
                filteredValue="#{bean.filteredValue}"
                paginator="true" rows="25" paginatorPosition="bottom"
                rowKey="${row.id}"
                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
                editable="true">

以及触发更新的按钮

<p:commandButton value="Save"
                        actionListener="#{bean.save}"
                        update=":form"/>

【问题讨论】:

  • 您使用的是行版还是单元格版?你能发布更多关于表格的代码吗?

标签: ajax jsf filter primefaces datatable


【解决方案1】:

更新 datatable 后,您必须调用它的客户端 filter() 方法。

<p:dataTable widgetVar="dataTableWidgetVar" id="dataTable" var="row"
             value="#{bean.value}"
             filteredValue="#{bean.filteredValue}"
             paginator="true" rows="25" paginatorPosition="bottom"
             rowKey="${row.id}"
             editable="true">

<p:commandButton value="Save"
                 actionListener="#{bean.save}"
                 update=":form"
                 oncomplete="PF('dataTableWidgetVar').filter()"/>

对于早于 5 的 PrimeFaces 版本,您应该使用

<p:commandButton value="Save"
                 actionListener="#{bean.save}"
                 update=":form"
                 oncomplete="dataTableWidgetVar.filter()"/>

【讨论】:

  • Kerem,我接受了你在回答中所说的话。它运作良好。但是我有每次操作后都会显示的咆哮消息。如果我使用您的解决方案,咆哮消息会尽快消失(1 秒)。你对此有什么想法吗?
  • filter() 方法创建另一个更新操作。如果您使用autoUpdate="true" 尝试autoUpdate="false" 并手动更新咆哮。你也可以让它变得粘稠。但请记住autoUpdate="true" 是针对简单页面的。如果您需要完全控制,请不要使用autoUpdate="true"
  • 嗨,Kerem,前段时间我问过你这个问题。它工作得很好,再次感谢它。我现在面临使用它的另一个问题。如果所选值(使用过滤器)是我的数据表第 3 页中的一行,并且在对该行进行操作之后,分页会自动重置为第 1 页。我希望它保持焦点在所选行所在的页面上,在这种情况下第 3 页。如果我手动转到第 3 页,该行仍处于选中状态。您对此有何建议?
  • 有一个名为“first”的数据表属性,解释为“要显示的第一个数据的索引”。我想这可能会解决你的问题。
  • 是的,你是对的,所以如果你不想刷新数据表两次,你只能调用过滤方法并从按钮的更新属性中删除数据表的 id。正如我之前提到的 filter() 方法创建另一个更新操作。
【解决方案2】:

对于primefaces大于等于5的版本,可以使用这块代码,效果很好

<p:dataTable var="page" value="#{yourBean.allData}" widgetVar="yourWidgetVarName"/>

<p:commandButton value="delete"
                 actionListener="#{yourBean.delete}"
                 update="@form"
                 oncomplete="PF('yourWidgetVarName').filter()"/>

【讨论】:

  • 我在上面的答案中编辑了这个(你可以提出这样的修改)并且它已经在下面的答案中!
【解决方案3】:

为 Primefaces 5.x 添加答案,因为它们改变了调用小部件 var 的方式:

与 Kerem Baydogan 的回答几乎相同,但稍作修改:

<p:commandButton value="Save"
                 actionListener="#{bean.save}"
                 update="@form"
                 oncomplete="PF('dataTableWidgetVar').filter()"/>

或者您可以使用以下命令完全清除过滤器:

<p:commandButton value="Save"
                 actionListener="#{bean.save}"
                 update="@form"
                 oncomplete="PF('dataTableWidgetVar').clearFilters()"/>

【讨论】:

  • 感谢老兄的更新。 Jazaka allah khairan 兄弟 :)
【解决方案4】:

如果您使用的是 primefaces 版本 5,只需制作表示单个数据行的数据类,以实现 Serializable

【讨论】:

  • 这是这个问题的答案吗?我的课程总是可序列化的,我有这个问题!
  • 如果你没有实现可串行化,过滤器将不起作用
  • 当然是。我有同样的问题,这个解决方案奏效了。我没有您使用可序列化的信息,因此无法排除此解决方案。
  • 大声笑,你明白这里的视图(用javascript控制的部分)根本与托管bean无关!如果你能给我一个很好的解释“可序列化”是如何涉及的,我将不胜感激!
  • 您要在该视图中显示什么?该模型!如果您无知,请不要投票!
猜你喜欢
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 2016-03-20
  • 2021-11-22
  • 1970-01-01
  • 2015-03-31
  • 2014-04-27
  • 2014-04-12
相关资源
最近更新 更多