【问题标题】:Kendo UI grid: refreshing grid data every 60 seconds with new data: dataSource and observe()Kendo UI 网格:每 60 秒用新数据刷新网格数据:dataSource 和 observe()
【发布时间】:2012-12-03 05:48:35
【问题描述】:

我想用最新数据每 60 秒刷新一次 Kendo UI 网格的内容。

编辑:这是在初始配置时分配数据源的方式:

parsedData = $.parseJSON(data);

var dataSource = new kendo.data.DataSource({
    data: parsedData
});

$("#grid").kendoGrid({
    dataSource: dataSource, 
    . . .

是否可以一举重新分配网格的数据源?还是单独删除 dataSource.data 中的项目,或者通过清除数组,然后注入新项目或整个替换数组会更好? Kendo 数据源中观察模式的实现是否表明一种方法优于另一种方法?

我还没有开始这样做,但是根据我对网格的经验,可以追溯到早期的 Visual Basic,更改网格的数据源总是会产生不良的副作用,我没有理由期望这会是任何一帆风顺。希望我错了。

另一个编辑#(2013 年 4 月 26 日):如果有一种方法可以使用与以前结构相同的一组新行来刷新网格的基础数据,一种方法可以保留展开/折叠状态网格的分组,这将非常适合我们的目的。

【问题讨论】:

  • 你的意思是刷新数据吗?
  • @NunoCarmo:结构保持不变;行数可能会发生变化,并且各个单元格的内容可能会有所不同。
  • 你使用剑道数据源来获取你的数据吗?
  • @NunoCarmo:见编辑。谢谢

标签: timer kendo-ui grid kendo-grid


【解决方案1】:

我们使用的是 Kendo 2012.3.1315.340 版本,对我们来说它是这样工作的:

$("#YourGridNameHere").data("kendoGrid").dataSource.read();

就像您告诉数据源再次读取数据一样。我们通常在 requestEnd 事件处理程序上这样做。

我希望这对某人有所帮助。

【讨论】:

  • 感谢您的建议:如果我们让网格负责获取其数据(即执行填充其数据源的 XHR),那么在 10 获取的数据集中存在的网格中的行会发生什么情况:00AM 但是哪些在上午 10:01 获取的数据集中不再存在,或者哪些已经改变?这些行是否从网格中删除?假设网格按状态列分组,特定行的状态从“In PaintShop”变为“InShipping”; read() 会导致行移动到正确的组吗?还是在执行 read() 时网格未分组?
  • 谢谢,但这给出了“TypeError: $(...).data(...) is undefined”错误。我还查看了许多页面并尝试了此解决方案的不同变体,但仍然得到相同的错误。有什么想法吗?
【解决方案2】:

从您的示例代码来看,您的 DataSource 似乎正在使用本地数据,而不是获取远程数据?

如果它正在获取远程数据,您可以简单地调用:

$("#grid").data("kendoGrid").dataSource.sync();

如果您的网格不是只读的,它将从服务器重新获取,并执行任何未完成的更新或删除。

要刷新本地数据,只需在 DaaSource 上设置.data 属性即可:

$("#grid").data("kendoGrid").dataSource.data(parsedData);

我面前没有一个可以尝试的工作示例,但是如果您的网格行在调用 dataSource.data() 函数后没有刷新,那么您可以 还需要在网格上调用刷新:

function updateGridData (parsedData) {
    var grid = $("#grid").data("kendoGrid");
    grid.dataSource.data(parsedData);
    grid.refresh();
}

【讨论】:

  • 我的网格并不真正知道它是如何获取数据的;在网格实例化中,我已经有一个完全填充的 Kendo 数据源对象,它被分配给网格的 dataSource 属性。所以我听从了你的建议,一举替换了 grid.dataSource.data 的内容:grid.dataSource.data(parsedData)。这种简单易行的方法的唯一缺点,对我们来说是一个显着的缺点,是网格不保留任何关于分组展开-折叠状态的记忆。
  • 如果我们让网格负责获取自己的数据,并使用 sync() 方法用新的远程数据刷新网格,分组是否持久化,或者 sync() 会导致基本的重新绑定,从而导致网格恢复到未分组状态? read()、sync()、data(new data) 都是调用相同底层行为的同义词吗?
  • .read() 从服务器获取新数据。 .sync() 将客户端上的任何待处理更新推送到服务器(不确定它是否也读取新数据)。 .data() 用你得到的任何数据替换数据,而不需要访问服务器。
  • 我对这个问题的回答可能会帮助您在刷新期间保持展开/折叠状态:stackoverflow.com/questions/13953278/…
  • 是的,这个答案的出发点是假设组没有被持久化,但我想知道是否有任何可用的方法不会首先破坏分组。另外,我认为使用 data(newData) 时 UID 不是持久的。
【解决方案3】:

要更新网格的数据源,请使用data 方法:

$("#grid").data("kendoGrid").dataSource.data(parsedData);

【讨论】:

    【解决方案4】:

    要更新网格,您需要处理数据源上的更改事件。

    change: function() {
        var grid = $(YouGridSelector).data("kendoGrid");
        grid.refresh();
    }
    

    当您更改数据源的数据时,这应该会更新您的网格。

    【讨论】:

    • 但我的问题是,更改数据源数据的最佳方法是什么?创建一个新的数据源对象?替换现有数据源对象的数据数组?一次从现有数据数组中删除一个项目(例如 pop()),然后一次插入一个新项目?
    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 2014-03-08
    • 2013-05-04
    • 1970-01-01
    • 2019-01-06
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多