论坛首页 编程语言技术论坛

[框架相关] Flex sdk3.5 ComboBox 的bug 及解决方案

浏览 2281 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-20   最后修改:2011-07-20
Flex sdk3.5 ComboBox 的bug
更改ComboBox的数据源,如果变化前后选中条目的label相同,那么下拉列表不会更新。
该现象在flex sdk 3.5中出现,换成flex sdk 3.2无此现象。


附件中含有测试用源码,和使用3.5与3.2编译的swf
附件中的操作方法:
1、 单击按钮,切换数据源,
2、 点击ComboBox 的箭头看一下下拉列表中的数据,
3、 重复1 2 操作,可以发现ComboBox 下拉列表没有变化
4、 选择某项,下拉列表更新。


造成的影响很恶劣:
如果数据源的长度大于1还可以通过切换条目,来更新显示列表;
一旦上一次的数据源长度为1,更新数据源后,长度大于1,但此时虽然能看到下拉列表的长度为新数据源的长度,但是label显示不出,并且无法切换选择条目。



flex 3.2 ComboBox 源码
/**
* flex 3.2 ComboBox 源码
     *  @inheritDoc
     */
    override public function set dataProvider(value:Object):void    {
        selectionChanged = true;
        super.dataProvider = value;
        destroyDropdown();
        _showingDropdown = false;
        invalidateProperties();
        invalidateSize();
}
flex 3.5 ComboBox 源码
/**
* flex 3.5 ComboBox 源码
     *  @inheritDoc
     */

override public function set dataProvider(value:Object):void    {
        selectionChanged = true;
        super.dataProvider = value;        
        destroyDropdown();
        invalidateProperties();
        invalidateSize();
}
看了一下源码,还没研究完!依然不知问题出在哪


附件驾到!!
[attach]50806[/attach]


原因:
ComboBox的下拉列表(_dropdown属性)默认是由 List 实现的,试验了一下List切换数据源,在sdk3.2和sdk3.5下均正常。由此可以推断是ComboBox 弹出 List时出现了问题。
sdk3.2和sdk3.5 的弹出原理相同:_dropdown是每次弹出下拉列表都要新建一个List。

不同的是:发现sdk3.2 的set  dataProvider 和updateDisplayList 中调用的 destroyDropdown()方法会执行
PopUpManager.removePopUp(_dropdown);
_dropdown = null;
而3.5中不会执行移除该操作,造成弹出下拉列表时两个或多个外观不同List的叠加,形成上述bug;

找到了临时解决方案:手动给ComboBox. dropdown设置数据源[/size][/color]
cb.dataProvider = b;
//_dropdown是每次弹出下拉列表都要重新创建一个,此代码也只能再增加一个弹出List。原来的那个并未移除。
cb.dropdown.dataProvider = b;
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics