记住在Kendo-UI中刷新时扩展的细节网格

Ale*_*xus 1 javascript jquery kendo-ui

我有一个使用detailInit方法实现网格内网格的场景.在用户进行编辑时,我会进行一些计算,这些计算将更改父和子中的数据.然后刷新数据,我将调用datasource.read来呈现数据.这工作并显示数据,但是任何展开的细节网格都将被折叠,有什么方法可以防止这种情况发生.

小智 5

要回答这个问题和另一个问题:

"我想出了如何从子节点设置主节点中的数据但是,当更新任何内容时,整个表会折叠子网格,这是一个非常烦人的行为,无论如何我只能更新主表中的字段而不用它会折叠所有子元素?(基本上,更新列,没有质量表更新)"

在另一个主题:telerik

这是剑道网格非常讨厌的行为和一个主要的错误.从什么时候开始,人们希望子网格消失并隐藏刚刚发生的变化!但这不是唯一的问题; 更改函数被称为Fibonacci次数,这将在大量点击后冻结浏览器.话虽这么说,这是我提出的解决方案:

在主网格中

 $('#' + grid_id).kendoGrid({
     width: 800, 
     ...
     detailExpand: function (e) {
         var grid = $('#' + grid_id).data("kendoGrid");
         var selItem = grid.select();
         var eid = $(selItem).closest("tr.k-master-row").attr('data-uid')
         if (contains(expandedItemIDs, eid) == false)
              expandedItemIDs.push(eid);
 },
 detailCollapse: function (e) {
    var grid = $('#' + grid_id).data("kendoGrid");
    var selItem = grid.select();
    var eid = $(selItem).closest("tr.k-master-row").attr('data-uid')
    for (var i = 0; i < expandedItemIDs.length; i++)
        if (expandedItemIDs[i] == eid) 
            gridDataMap.expandedItemIDs.splice(i, 1);
},
Run Code Online (Sandbox Code Playgroud)

不幸的是全球我们有:

function subgridChange() {
      var grid = $('#' + grid_id).data("kendoGrid");
      for (var i = 0; i < expandedItemIDs.length; i++)
       grid.expandRow("tr[data-uid='" + expandedItemIDs[i] + "']");
}
function contains(a, obj) {
   for (var i = 0; i < a.length; i++) 
       if (a[i] === obj)  return true;
   return false;
}
expandedItemIDs = [];
Run Code Online (Sandbox Code Playgroud)

现在每次对子网格进行更改时都需要调用'subgridChange()'函数.

问题是子网格中的更改函数被调用的次数在每次更改调用时呈指数级增长.Kendo网格应该能够调用停止传播函数来防止这种情况,或者至少让程序员访问事件对象,以便程序员可以阻止传播.在完全烦恼之后,我们所要做的就是将'subgridChange()'函数放在子网格'datasource'中,如下所示:

dataSource: function (e) {
    var ds = new kendo.data.DataSource({
        ...
        create: false,
        schema: {
            model: {
                ...
            }
        },

        change: function (e) {
            subgridChange();
        }
    });
    return ds;
}
Run Code Online (Sandbox Code Playgroud)

我还必须使用类似的东西将'subgridChange()'函数放在Add按钮函数中

$('<div id="' + gridID + '" data-bind="source: prodRegs" />').appendTo(e.detailCell).kendoGrid({
      selectable: true,
      ...
      toolbar: [{ template: "<a class='k-button addBtn' href='javascript://'><span class='k-icon  k-add' ></span> Add Product and Region</a>" }]
});

$('.addBtn').click(function (event) {
    ...
    subgridChange();
});
Run Code Online (Sandbox Code Playgroud)