维护一个Flex 项目,项目有点老,无意被我发现了一个bug,checkbox混乱显示。
BUG描述:DataGrid 一行ItemRenderer是单选框,当只有一页数据的时候,没问题,但当有两页及以上数据的时候,如果在第一页选中了部分记录,翻页再选几条,然后再翻到第一页,发现现在被选中的数据已不是我开始选中的了,但是我自己将选中数据放到了一个Array中,发现记录是没错的,只是单选框的选中状态错了。
BUG原因:每次翻页的时候,当前数据的指向会变化,而判断选中与否的依据就是array中是否包含了当前页面的数据data,用的是ArrayCollection.contains()这个方法。
但是这个方法比较的是引用,而data在每次翻页的时候他的引用都会发生变化,所以每次翻页就会错乱。
BUG解决:我自己是这样解决的,由于我flex 也不熟悉,可能不是很好。
由于我的数据复杂,所以我建立了Array_data ,array_id两个容器。判断的时候 我判断array_id是否包含 data.id;这样虽然data 的整体引用改变了,但是data 的id是不变的。
然后我在ItemRenderer中增加了一个dataChange方法。这样每次我的数据翻页的时候,我都去做个判断,拿data的id和array_id里的id做比较,这样就防止了 翻页显示错乱的现象了。
这个是每次点击单选框来存储数据data和data的id:
var data_list:ArrayCollection = parentDocument.parentDocument.dgselected;//存储选中的对象data
var arr_Id:ArrayCollection=parentDocument.parentDocument.arr_id;//存储选中的sid
if(cbox.selected)
{
//最开始的判断方式 当翻页后就无法判断了
// if(!data_list.contains(data))
// {
// data_list.addItem(data);
// arr_Id.addItem(data.shopkeeper.sid);
// isshow = true;
// }
if(!arr_Id.contains(data.shopkeeper.sid))
{
data_list.addItem(data);
arr_Id.addItem(data.shopkeeper.sid);//用于页面刷新后 显示选中状态
isshow = true;
}
}
这个是 每次翻页后判断显示状态: isshow为布尔型,来控制checkbox的选中状态;
protected function griditemrenderer1_dataChangeHandler(event:FlexEvent):void
{
if(parentDocument.parentDocument.arr_id.contains(data.shopkeeper.sid))
{
trace(parentDocument.parentDocument.arr_id.length)
isshow=true;
}else
{
trace(parentDocument.parentDocument.arr_id.length)
isshow=false;
}
}