当我搜索项目时,Flex DropDown选项不起作用

时间:2011-11-26 02:28:16

标签: arrays actionscript-3 flex drop-down-menu

所以这是我到目前为止的问题。我试图简化我的代码,所以我可以尝试解决这个问题,但我绝对没有运气。我有一个视图堆栈,每个堆栈包含1个下拉列表。他们共享相同的数据提供者。我想要做的是从第一个中选择项目内容。一旦我这样做,当我单击一个按钮到下一个堆栈时,我有一个从索引0到数据提供者长度搜索的函数,如果第一个堆栈中的项目与第二个堆栈匹配,我想要第二个下拉选择该项目并显示它。我有它匹配,我尝试选择它,但当我运行应用程序时,它显示没有选择任何东西。这就是我所拥有的:

编辑:我得到了一个简单的例子,但当我尝试在我更复杂的例子中使用它时,在该按钮上单击它会出于某种原因将selectedIndex的值重置为-1。我该如何防止这种情况发生?这是简单示例的工作代码

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="popList()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>


<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.controls.Alert;
        [Bindable]
        private var myList : ArrayCollection;

        [Bindable]
        private var selectedItem : String;

        [Bindable]
        private var index : int;

        [Bindable]
        private var ind : int;

        private function popList() : void {
            myList = new ArrayCollection();
            stack.initialize();
            myList.addItem("1");
            myList.addItem("2");
            myList.addItem("3");
            myList.addItem("4");
            myList.addItem("5");
            myList.addItem("6");
            first.initialize();
            second.initialize();
        }

        private function goNext() : void {
            selectedItem = first.selectedItem;
            stack.selectedChild = stackb;

            for(index = 0; index < myList.length; index++){
                var itemNow : String = myList[index].toString();
                if(selectedItem == myList[index].toString()){
                    ind = index;
                }
            }

        }

    ]]>
</fx:Script>
<mx:ViewStack id="stack" width="862" height="500">
    <s:NavigatorContent id="stacka">
        <s:DropDownList x="317" y="174" id="first" dataProvider="{myList}"></s:DropDownList>
        <s:Button id="next" x="335" y="263" label="Next" click="goNext()"/>
    </s:NavigatorContent>
    <s:NavigatorContent id="stackb">
        <s:DropDownList x="317" y="174" id="second" dataProvider="{myList}" selectedIndex="{ind}"></s:DropDownList>
    </s:NavigatorContent>
</mx:ViewStack>



</s:Application>

1 个答案:

答案 0 :(得分:2)

我没有尝试运行代码,但我有一堆观察结果:

  1. 首先,不要对两个单独的DropDownLists使用相同的dataProvider。它会导致奇怪的问题。没有意义,我不明白为什么;但确实如此。您可以通过使用相同的源创建第二个集合来欺骗dataProvider。这样的事情:
  2. -

    second.dataProvider = new ArrayCollection(myList.source);
    
    1. 其次,您不必在任何一个DropDownLists上手动调用initialize方法。这非常不寻常。 initialize事件作为创建过程的一部分被触发;我假设初始化方法是默认事件处理程序的一部分。但是,触发该事件与使组件完成生命周期过程并不相同。

    2. ViewStack在视图更改之前不会初始化它的子项。因此,您可能在初始化DropDownList之前在第二个DropDownList上设置selectedIndex,可能允许该下拉列表丢失。您可以通过在ViewStack上将creationPolicy设置为all来解决此问题。

    3. 您可以通过绑定解决此问题。像这样的东西。

    4. -

      <s:DropDownList x="317" y="174" id="second" dataProvider="{myList}" selectedIndex="{first.selectedIndex}"></s:DropDownList>
      
      1. 您选择下一项的代码是将对象与字符串进行比较,因此您将选择selectedItem。
      2. 您可以将循环更改为以下内容:

                for(index = 0; index < myList.length; index++){
                    if(selectedItem == myList[index]){
                        second.selectedIndex = index;
                    }
                }
        
        1. 但是,如果您使用相同的dataProvider或其副本,为什么还需要循环?只需使用selectedIndex属性:
        2. -

          second.selectedIndex = first.selectedIndex 
          

          这有帮助吗?

          注意:StackOverflow使得在列表中进行代码格式化变得非常困难;抱歉没有将号码保留在我的列表中。