Dojo - 调用排序后行从 DataGrid 中消失
Dojo - Rows disappears from DataGrid after calling sort
我在对网格进行排序时遇到了 DataGrid 的问题。
对于这个问题,当我们在一个调用流程中执行这一系列操作时,所有行都会消失:
- 向网格的商店添加一项。
- 从网格的商店中删除一项
- 保存商店
- 呼叫grid.sort.
在调用 grid.sort 网格尿布的所有行后(尽管它们仍在商店中)。如果我们重复相同的过程,它们就会回来。
我有一个复制器代码,我基于 DataGrid 的自定义网格组件在这里:
MyGrid.js
如果您像我在 Scenarios.js 的第 38 行中那样调用 MyGrid 的 addOneDelOne,您将能够重现该问题。
在此代码中,如果商品超过 4 件,商品就会从商店中移除。
如果添加的项目数大于删除的项目数,如果我们对网格进行排序,也不会出现此问题。
我已经在 Dojo 1.9 和 1.13 上测试过
我相信我们找到了这个问题的解决方案。
问题出在 Dojo 的 DataGrid 的 _onFetchBegin 方法上。
当我们在 DataGrid 上调用排序时,它实际上通过调用 updateRowCount(0).
来清除一些计数器
其中一个被清除的计数器是 this.invalidated.rowCount,DataGrid 和 dojo 实际使用它来打印记录。打印记录数等于this.invalidated.rowCount值。
稍后,在 grid.sort() 调用处理期间,dojo 转到 _fetch(0, isRender); 方法。此方法最终调用 this.store.fetch({...}) ,它根据从商店返回的项目更新网格。它由回调方法 _onFetchBegin 和 _onFetchComplete 完成。问题出在 _onFetchBegin
在我们的例子中,从商店返回的项目数等于网格中的行数。 if(this.rowCount != size) <-- 这是错误的。请注意,我们在这里不使用 this.invalidated.rowCount,而是使用 this.rowCount。 this.invalidated.rowCount 之前在 updateRowCount(0) 中设置为 0。通常,当这个条件为真时,我们会调用 this.updateRowCount(size);其中 size 是商店中的商品数量。 dojo 会用行打印网格。但在我们的例子中,this.rowCount 和 size 是相同的(我们在记录上添加,并删除一条记录)所以我们结束了在 DataGrid
中进一步耦合行
if(!size){
this.views.render();
this._resize();
this.showMessage(this.noDataMessage);
this.focus.initFocusView();
}else{
this.showMessage(); <- we ended up here. And we we do not update the RowCount :(
}
如果我们通过在 this.showMessage(); 之前添加 this.updateRowCount(size); 来修改 Dojo 的 DataGrid
像这样
else{
this.updateRowCount(size);
this.showMessage();
}
会好的
我在对网格进行排序时遇到了 DataGrid 的问题。
对于这个问题,当我们在一个调用流程中执行这一系列操作时,所有行都会消失:
- 向网格的商店添加一项。
- 从网格的商店中删除一项
- 保存商店
- 呼叫grid.sort.
在调用 grid.sort 网格尿布的所有行后(尽管它们仍在商店中)。如果我们重复相同的过程,它们就会回来。
我有一个复制器代码,我基于 DataGrid 的自定义网格组件在这里: MyGrid.js
如果您像我在 Scenarios.js 的第 38 行中那样调用 MyGrid 的 addOneDelOne,您将能够重现该问题。
在此代码中,如果商品超过 4 件,商品就会从商店中移除。
如果添加的项目数大于删除的项目数,如果我们对网格进行排序,也不会出现此问题。
我已经在 Dojo 1.9 和 1.13 上测试过
我相信我们找到了这个问题的解决方案。 问题出在 Dojo 的 DataGrid 的 _onFetchBegin 方法上。
当我们在 DataGrid 上调用排序时,它实际上通过调用 updateRowCount(0).
来清除一些计数器其中一个被清除的计数器是 this.invalidated.rowCount,DataGrid 和 dojo 实际使用它来打印记录。打印记录数等于this.invalidated.rowCount值。
稍后,在 grid.sort() 调用处理期间,dojo 转到 _fetch(0, isRender); 方法。此方法最终调用 this.store.fetch({...}) ,它根据从商店返回的项目更新网格。它由回调方法 _onFetchBegin 和 _onFetchComplete 完成。问题出在 _onFetchBegin
在我们的例子中,从商店返回的项目数等于网格中的行数。 if(this.rowCount != size) <-- 这是错误的。请注意,我们在这里不使用 this.invalidated.rowCount,而是使用 this.rowCount。 this.invalidated.rowCount 之前在 updateRowCount(0) 中设置为 0。通常,当这个条件为真时,我们会调用 this.updateRowCount(size);其中 size 是商店中的商品数量。 dojo 会用行打印网格。但在我们的例子中,this.rowCount 和 size 是相同的(我们在记录上添加,并删除一条记录)所以我们结束了在 DataGrid
中进一步耦合行if(!size){
this.views.render();
this._resize();
this.showMessage(this.noDataMessage);
this.focus.initFocusView();
}else{
this.showMessage(); <- we ended up here. And we we do not update the RowCount :(
}
如果我们通过在 this.showMessage(); 之前添加 this.updateRowCount(size); 来修改 Dojo 的 DataGrid
像这样
else{
this.updateRowCount(size);
this.showMessage();
}
会好的