在排序网格时,我遇到了DataGrid的问题。
有了这个,当我们在一个调用流程中执行这一系列动作时,所有行都会消失:
从网格尿布中调用grid.sort所有行(尽管它们仍在商店中)。如果我们重复相同的程序,他们会回来。
我有一个重现器代码,我的基于DataGrid的自定义Grid组件在这里: MyGrid.js
如果您调用MyGrid的addOneDelOne,就像我在Scenarios.js的第38行中所做的那样您将能够重现该问题。
在此代码中,如果项目超过4个,则会从商店中删除项目。
如果我们在添加的项目数量大于已删除项目时对网格进行排序,则不会出现此问题。
我在Dojo 1.9和1.13
上测试过它答案 0 :(得分:1)
我相信我们找到了解决这个问题的方法。 问题在于Dojo的DataGrid的 _onFetchBegin 方法。
当我们在DataGrid上调用sort时,它实际上通过调用 updateRowCount(0)来清除一些计数器。
其中一个清除的计数器是 this.invalidated.rowCount ,它实际上由DataGrid和dojo用于打印记录。打印记录的数量等于this.invalidated.rowCount值。
稍后,在grid.sort()调用处理期间,dojo转到 _fetch(0,isRender); 方法。此方法最终调用this.store.fetch({...}),它根据从store返回的项更新网格。它由回调方法_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();
}
没关系。