【问题标题】:Why are the labels mysteriously dissappearing from a ComboBox in Flex 3?为什么 Flex 3 中的 ComboBox 中的标签会神秘消失?
【发布时间】:2010-04-16 05:35:30
【问题描述】:

观察下面的 Flex 程序(我使用的是带有 3.5 SDK 的 Flex Builder 3)。第二个组合框以第一个为条件。如果选择了“名字”,那么您可以选择“姓氏”。如果选择“无”,则不允许您选择姓氏,而是提示您选择名字。

要查看标签消失的神秘问题,请运行此程序并选择一个名字。然后选择一个姓氏。一切都很好。然后在第一个组合框中选择“无”。第二个组合框的提示变回,姓氏被删除。一切都还好。然后尝试再次选择名字和姓氏。您会看到,在选择了名字后,姓氏并没有出现,尽管它们的空格会出现(如果您调试程序,正确的数据会出现在 dataprovider 中)。

这个“虫子”整天都在杀死我。我在其中实现此行为的项目要复杂得多,但此示例基本上说明了正在发生的事情。这是 Flex 中的错误,还是我做错了什么?

谢谢!

<?xml version="1.0" encoding="utf-8"?>

<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        [Bindable]
        public var cbCompanyDP:ArrayCollection = new ArrayCollection( [ { firstName: "None", data: 0 },
                                                                        { firstName: "Bob", data: 1 },
                                                                        { firstName: "Bart", data: 2 } ] );

        [Bindable]
        public var cbEmployeeDP:ArrayCollection = new ArrayCollection();

        public var employees:ArrayCollection = new ArrayCollection( [ { lastName: "Smith" },
                                                                      { lastName: "Smyth" },
                                                                      { lastName: "Smick" },
                                                                      { lastName: "Smack" } ] );

        [Bindable]
        public var prompt:String = "Choose First Name first";

        public function cbFirstNameChange( value:int ):void
        {
            if ( value == 0 )
            {
                employees.removeAll();
                setEmpDP( employees );
                prompt = "Choose First Name first";
            }
            else
            {
                setEmployees();
                setEmpDP( employees );
                prompt = "Now choose Last Name";
            }
        }

        private function setEmpDP( ac:ArrayCollection ):void
        {
            cbEmployeeDP = ac;
        }

        private function setEmployees():void
        {
            employees = new ArrayCollection( [ { lastName: "Smith" },
                                               { lastName: "Smyth" },
                                               { lastName: "Smick" },
                                               { lastName: "Smack" } ] );
        }
    ]]>
</mx:Script>

<mx:HBox>

    <mx:ComboBox dataProvider="{cbCompanyDP}"
        id="cbFirstName"
        labelField="firstName"
        width="200"
        change="cbFirstNameChange(cbFirstName.selectedItem.data)"
        prompt="Choose a first Name" />

    <mx:ComboBox dataProvider="{cbEmployeeDP}"
        id="cbLastName"
        labelField="lastName"
        width="200"
        prompt="{prompt}" />
</mx:HBox>

【问题讨论】:

  • 老兄!我试过你的 pgm,它在 ma 机器上没有显示这样的问题!!!
  • 这令人沮丧。您使用的是什么版本的 Flex SDK?哪个版本的 Flash Player?

标签: apache-flex flex3


【解决方案1】:

这里的问题是缺少绑定。 如果更改 ComboBox 的 dataProvider,它不会更改生成的下拉列表的 dataProvider。所以盒子知道新列表,但下拉列表仍然处理旧列表。 要解决此问题,您必须继承 ComboBox 并覆盖 set dataProvider 并获取 dataProvider(为了对称)。

override protected function set dataProvider (value:Object):void {
  super.dataProvider=value;
  if(dropdown != null)
    super.dropdown.dataProvider=value;
}

若要在 ComboBox 宽度发生变化的情况下更新下拉菜单的宽度,还需要重写另一个函数:

override protected function updateDisplayList
    ( unscaledWidth:Number, unscaledHeight:Number ):void {
  super.updateDisplayList (unscaledWidth, unscaledHeight);
  if (dropdown != null)
    dropdown.width = unscaledWidth;
}

这样就可以正常工作了。 如果需要,可以在 set 函数中检查 selectedIndex 是否为 -1(在可编辑框中表示有手动输入的内容),将其从 super.text 保存并将其恢复为 super.text(并设置索引再次设置为 -1)一旦您设置了新的 dataProvider。否则输入字段中的文本将丢失或被第一个列表元素替换。

【讨论】:

    【解决方案2】:

    如果已经设置了数据提供者,则不要在 Flex 3.5 中为 dataProvider 设置新的 ArrayCollection - 设置 dataProvider.source(不进行新引用)

    【讨论】:

    • 这对我有用,比将我的所有 ComboBox 实例更改为自定义组件要容易得多。
    【解决方案3】:

    我昨天也遇到了同样的问题。这似乎是3.5中的一个错误。 当您将新的 ArrayCollection 对象分配给组合框中绑定的对象时,就会发生这种情况。如果您单击组合框,它将刷新,并显示真实内容。

    3.5 中的解决方法:不要给绑定的变量分配新的arraycollection。您应该只按照 anton 所说的设置源,或者使用 add/remove/addAll Item 方法。这样的事情也应该起作用:

    private function setEmpDP( ac:ArrayCollection ):void
        {
    
            cbEmployeeDp.removeAll();
            cbEmployeeDP.addAll(ac);
        }
    

    【讨论】:

      【解决方案4】:

      我尝试使用不同的 SDK(3.2 和 4)并且它正在运行,所以我猜这是 3.5 的错误

      【讨论】:

        【解决方案5】:

        看来有两个答案: 是的,这是 Flex 3.5 sdk 中的一个错误,因为它不会在 4 中发生(我没有用其他 SDK 测试过)。但是,由于我无法在项目中更改 SDK,因此解决方法出现在另一个问题中: Flex 3.5.0; Update ComboBox display list upon dataprovider change

        感谢大家的意见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-18
          • 2015-05-11
          • 1970-01-01
          • 1970-01-01
          • 2012-12-02
          • 2019-03-12
          • 2011-08-23
          • 2014-08-14
          相关资源
          最近更新 更多