Kendo UI 数据源更改事件:它有效吗?

Posted

技术标签:

【中文标题】Kendo UI 数据源更改事件:它有效吗?【英文标题】:Kendo UI dataSource changed event: is it working? 【发布时间】:2012-12-03 07:26:40 【问题描述】:

dataSource.changed 事件是否有效?

在我的 Kendo UI 网格实例化后,我将按照此处的文档绑定更改事件:

http://docs.kendoui.com/api/framework/datasource#change

//To set after initialization
dataSource.bind("change", function(e) 
    // handle event
);

我正在这样做:

// initialize
$("#grid").kendoGrid(
        dataSource: dataSource, 

        blah blah blah
)

);
// end of initialization



// bind afterwards
 var grid = $('#grid').data('kendoGrid');
  grid.dataSource.bind("change", function (e) 
      dataChanged();
  );


 //also tried a setTimeout:

  // bind afterwards
  setTimeout(function () 
    var grid = $('#grid').data('kendoGrid');
    grid.dataSource.bind("change", function (e) 
        dataChanged();
    );
, 350);



 function dataChanged() 
   // handle "change" whatever that means -- documentation definition is hazy
   // does reassigning the data array constitute a change?
   // does changing the value of a particular item in the data array
   // constitute a change?
   // does removing an item from the data array constitute a change?

    var grid = $("#grid").data("kendoGrid");
    grid.refresh();
 

但是当我执行以下任一操作时,我的 dataChanged() 函数不会被调用:

var grid = $('#grid').data('kendoGrid');
grid.dataSource.data()[1]["deptname"] = 'XXX';

grid.dataSource.data = aDifferentArray;

我不确定“更改”事件到底在听什么。究竟是什么触发了它?

如果我创建一个全新的数据源,并将其分配给已有数据源的网格,我看不出这将如何触发现有数据源的更改事件。这样的事件(网格注意到其 dataSource 已被替换为不同的事件)将是网格级事件,而不是数据源级事件,对吧?

【问题讨论】:

【参考方案1】:

需要注意的重要一点是支持DataSource 的数据是ObservableArray,并且该数组中的数据项被转换为ObservableObjects。

数据源的change 事件在两种情况下触发:

    数据ObservableArray 发生变化(插入、删除记录)。这方面的一个例子是使用DataSource.add()DataSource.remove() 函数。

    如果属性更改事件从数组中的 ObservableData 对象之一冒泡到 DataSource。但是,就像 Kendo MVVM 框架的其余部分一样,属性更改的通知仅在调用其 .set("propertyName", value) 函数时才会发生。

这就是grid.dataSource.data()[1]["deptname"] = 'XXX'; 没有触发更改事件的原因。如果您将其更改为:grid.dataSource.data()[1].set("deptname", 'XXX'); 那么它应该开始工作。基本上,将change 事件视为响应data 可观察对象触发的MVVM 属性更改而触发。

至于更改数据数组grid.dataSource.data = aDifferentArray; 我实际上不确定这是否会或应该触发更改。我从来没有尝试过。

【讨论】:

感谢您的澄清。 .set 方法确实触发了更改事件,而 grid.dataSource.data = aDifferentArray 没有,据我所知。我希望 Kendo 网格中有一个与 WinForms 网格中的 DataSource_Changed 事件等效的事件——当网格被分配一个不同的数据源时触发,因为我希望每 60 秒用新数据刷新一次网格:***.com/questions/13892021/… 实际上,要换出数据,我认为您使用 .data() 函数:docs.kendoui.com/api/framework/datasource#data 所以您的代码将是 grid.dataSource.data(aDifferentArray); 有人考虑过使用 kendo.Observable 吗?我正在尝试将我的数据源作为可观察的,因此每当有更改时,它都会更新视图模型

以上是关于Kendo UI 数据源更改事件:它有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

Kendo UI Grid:如果有任何未决更改,则无法拦截和取消排序事件

Kendo UI Dropdownlist 从大型数据源加载缓慢

更改 Kendo UI 调度程序中事件的宽度

在 Kendo UI Mobile 的显示事件中更改标题?

kendo ui 角度网格选择事件

在下拉选择的索引更改事件上刷新 Kendo UI 网格