kendo网格数据绑定正在递归

时间:2016-08-22 15:37:32

标签: javascript jquery kendo-ui grid kendo-grid

我有一个带有dataBound函数集的kendoGrid。

下面是我的代码示例,数据绑定内部是一些更新UI视图的集合。这个问题是,如果我在第二行(var pageData ...)上放置一个调试器,我可以看到.set再次触发dataBound函数。我假设该函数应该运行一次,并且.sets不会重新触发它。

如果你知道我做错了什么,请帮忙。感谢

function() {
    var pageData = grid.dataSource.data();
    $.each(pageData, function(index, row){
        if (row.Id == cachedRowWithChanges.Id) { //example
            row.set("CartTotal", cachedRowWithChanges.CartTotal);
        }
    });
}

3 个答案:

答案 0 :(得分:1)

您可以移动逻辑以更改数据源事件

 dataSource: {        
    change: function(e) {
         // data will have new data source
         var data = this.data();    
    }  
 }

http://jsbin.com/saqaxefezo/1/edit?html,js,output

答案 1 :(得分:1)

为防止无限递归,您可以在网格中使用简单的全局变量或自定义属性,如下所示:

function() {
    if (!this.__busy) {
        this.__busy = true;

        var pageData = grid.dataSource.data();
        $.each(pageData, function(index, row){
            if (row.Id == cachedRowWithChanges.Id) { //example
                row.set("CartTotal", cachedRowWithChanges.CartTotal);
            }
        });

        this.__busy = false;
    }
}

答案 2 :(得分:0)

通过set()设置数据项值会触发Grid DataSource实例的change事件,从而导致Grid重新绑定并显示其数据的最新状态。

您可以采取哪些措施来阻止多个dataBound事件触发:

  • 使用dataBinding事件
  • 通过直接设置器更新数据项,而不是通过API:

    row.CartTotal = cachedRowWithChanges.CartTotal;
    row.dirty = true;
    
  • 如果您想通过内置的Kendo UI CRUD操作将更改保留到远程数据服务,则需要上面的第二行。

以下是一个例子:

http://dojo.telerik.com/AYOrIL