【问题标题】:How to prevent kendo grid reload?如何防止剑道网格重新加载?
【发布时间】:2016-12-01 16:16:28
【问题描述】:

我有两个剑道网格 (A, B) ...B 通过单击 A 加载,其数据源通过 A 中选定行的属性加载..

A.帐户

dataSource: {
    data: this.gridA.dataItem(this.gridA.select()),
},

我的问题是,在 BI 中必须使用网格更改属性,但是当属性更改网格时,它会重新加载,并且如果我在更改网格中的属性时有 1000 行(任何行,999 即),滚动回到开头 ...我已经阅读并尝试理解它,但是无法修复它...根据官方文档,

选择的行
var row = this.gridApprovals.select();
var caBean = this.gridApprovals.dataItem(row);

它是一个 ObservableObject,因此,当我尝试更改一个属性时,某个(ObservableOject 的)方法会产生这种行为,并且重新加载网格,它会迭代每个数据源项...

编辑: 我忘了提..保持B网格的变化与其在A slection中的关系之间的关系很重要.. 这是一个道场项目http://dojo.telerik.com/uYemI/2

【问题讨论】:

  • 您至少需要提供您的网格定义。更好的是,提供一个指向展示问题的剑道道场示例的链接。
  • 谢谢..我已经做到了....这里是链接dojo.telerik.com/uYemI/2
  • 我还不知道如何修复它,但它是导致它的 k-rebind="carsGridOptions"...当 editCell 触发时,此属性会导致 k-rebind触发所以 setGridOptions 触发重新绑定整个数据源(并重置网格)。您需要找到一种方法来将新数据推送到网格中而不使用 k-rebind(由于某种原因会在编辑时触发)。所以本质上,每个 editCell 都会导致网格重新初始化其数据源(通过 k-rebind 映射),这会导致重新读取。我们不需要这样做......;)

标签: javascript angularjs kendo-ui grid


【解决方案1】:

这个怎么样?

http://dojo.telerik.com/@Stephen/aNije

我删除了 k-rebind 属性,而是在 setCarsGrid() 方法中连接了 dataSource:

$scope.setCarsGrid = function() {
            var row = this.brandGrid.select();
            var brand = this.brandGrid.dataItem(row);
                            var brandObj=brand.toJSON();

            var dataSource = new kendo.data.DataSource({
              data: brand.cars,
              schema:{
                model:{
                  fields:{
                    id:{editable:false},
                    model:{editable:false},
                    color:{type:"string"}
                  }
                },
                parse: function(response) {
                  $.each(response, function(idx, elem) {
                    elem.id = elem.id+10;
                    //if you put a break point here, every time you try to edit 'color' field.. will be stop because datasourse is iterated again 
                    console.log("Grid has been reloaded and the editable field 'color' can be edited :'( the id property has been added +10")
                  });

                  return response;
                }                                    
              }
            });

          // This first time this is called, the carsGrid has not been initialized, so it doesn't exist.
          // But subsequent times, we just need to set the new datasource.
          if (this.carsGrid) {
            this.carsGrid.setDataSource(dataSource);
          }

            $scope.carsGridOptions = {
                    dataSource: dataSource,
                    selectable:true,
                    editable: true,
                    columns: [{
                        field: "id",
                        },{
                        field: "model",
                        },{
                        field: "color",
                    }]
                };                     

        }

本质上,我只是将 GRID 的初始化与网格的 DATASOURCE 的设置分开。 第一次,您设置了网格选项并设置了数据源,然后在随后的时间里,我们只是将网格设置为新的数据源。

这避免了 k-rebind 行为...我相信这已记录在案:http://docs.telerik.com/kendo-ui/AngularJS/introduction#widget-update-upon-option-changes

这种方法不适用于 dataBound 小部件,因为这些小部件会在其数据每次更改时重新创建 - 例如,在 Grid 分页之后。

注意,我不太了解 Angular,因此可能有更好的方法来组织此代码,但它确实有效。

【讨论】:

  • 它看起来不错,但在我的项目中不起作用,我认为它是我的剑道版本,我忘了在道场中设置版本.. 我使用的是剑道 UI 2015 Q2 .. 看起来像我无法以这种方式设置数据源...嗯
  • 嗨.. 经过一些实验后,我使用了 this.carsGrid.setOptions,这是一个带有 mi 最终代码的道场......感谢@The Dread Pirate Stephen 的帮助......dojo.telerik.com/@alfonsomonroyiv/oneJA
猜你喜欢
  • 2013-08-26
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多