所以这是我到目前为止的问题。我试图简化我的代码,所以我可以尝试解决这个问题,但我绝对没有运气。我有一个视图堆栈,每个堆栈包含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>
答案 0 :(得分:2)
我没有尝试运行代码,但我有一堆观察结果:
-
second.dataProvider = new ArrayCollection(myList.source);
其次,您不必在任何一个DropDownLists上手动调用initialize方法。这非常不寻常。 initialize事件作为创建过程的一部分被触发;我假设初始化方法是默认事件处理程序的一部分。但是,触发该事件与使组件完成生命周期过程并不相同。
ViewStack在视图更改之前不会初始化它的子项。因此,您可能在初始化DropDownList之前在第二个DropDownList上设置selectedIndex,可能允许该下拉列表丢失。您可以通过在ViewStack上将creationPolicy设置为all来解决此问题。
您可以通过绑定解决此问题。像这样的东西。
-
<s:DropDownList x="317" y="174" id="second" dataProvider="{myList}" selectedIndex="{first.selectedIndex}"></s:DropDownList>
您可以将循环更改为以下内容:
for(index = 0; index < myList.length; index++){
if(selectedItem == myList[index]){
second.selectedIndex = index;
}
}
-
second.selectedIndex = first.selectedIndex
这有帮助吗?
注意:StackOverflow使得在列表中进行代码格式化变得非常困难;抱歉没有将号码保留在我的列表中。