Apache flex 在flex中迭代数据提供程序

Apache flex 在flex中迭代数据提供程序,apache-flex,iterator,dataprovider,Apache Flex,Iterator,Dataprovider,我想知道。。。我想在一个基于DropDownList的组件中迭代一个数据提供者。 第一件事是,它在编译时不起作用,但从未迭代: var o:Object; for each (var o:Object in dataProvider) { } 我猜它不起作用是因为IList不提供对象,或者其他人可以很容易地解释的东西 从效率的角度看,我尝试了一些看起来很可怕的东西,但它仍然有效。就是这样: for (var i:int = 0; i < dataProvider.length; i++)

我想知道。。。我想在一个基于DropDownList的组件中迭代一个数据提供者。 第一件事是,它在编译时不起作用,但从未迭代:

var o:Object;
for each (var o:Object in dataProvider)
{
}
我猜它不起作用是因为IList不提供对象,或者其他人可以很容易地解释的东西

从效率的角度看,我尝试了一些看起来很可怕的东西,但它仍然有效。就是这样:

for (var i:int = 0; i < dataProvider.length; i++)
{
   o = dataProvider.getItemAt(i);
}
使用val将DropDownList设置/获取到正确的索引,并将该值与idxName中定义的变量进行比较

好吧,这是整个代码没有那么多:

<?xml version="1.0" encoding="utf-8"?>
<s:DropDownList xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx"
                change="ch()">
    <fx:Declarations>
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            private var _selectedN:String;

            public var idxName:String = 'n';

            [Bindable(event="changeSelected")]
            public function get selectedN():String
            {
                return this.selectedItem[idxName];
            }

            public function set selectedN(v:String):void
            {
                var o:Object;
//              for each (var o:Object in dataProvider) @@
                for (var i:int = 0; i < this.dataProvider.length; i++)
                {
                    o = dataProvider.getItemAt(i);
                    if (o[idxName] == v)
                    {
                        this.selectedIndex = i;
                        _selectedN = v;
                        dispatchEvent(new Event("changeSelected"));
                        return; 
                    }

                }
                this.selectedItem = null; // no seleccionar nada (@@?)
                _selectedN = null;
                dispatchEvent(new Event("changeSelected"));
            }

            private function ch():void
            {
                _selectedN = this.selectedItem[idxName];
                dispatchEvent(new Event("changeSelected"));
            }
        ]]>
    </fx:Script>
</s:DropDownList>
实际上,每个循环的速度都比正常循环慢一点。看看你的答案

要回答您的问题,为什么for-each循环不起作用。不幸的是,这种类型的循环只适用于某些类型的类。据我所知,这些是:

大堆 矢量 XML XML列表 以及扩展代理的类,这些代理实现每个循环所需的函数。我只知道ListCollectionView及其子类ArrayCollection和XMLListCollection。 像ArrayList这样的集合类不适用于for-each循环,因为它们不是类似Flash Player的数组中的本机对象,并且它们不扩展代理类


因此,最好的方法是使用simple for循环,这些循环甚至比for each循环更快。

我很惊讶第一种方法不起作用。我也很惊讶第二种方法会出现性能问题。我希望第二个循环更有效,因为它是循环开始时已知的循环迭代次数。也许你可以详细说明你想做什么和/或提供一个可运行的示例来解释你的问题。好吧,如果第一种方法有效,也许第二种方法仍然比第一种更好。。。我将尝试详细说明更多。。。
<?xml version="1.0" encoding="utf-8"?>
<s:DropDownList xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx"
                change="ch()">
    <fx:Declarations>
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            private var _selectedN:String;

            public var idxName:String = 'n';

            [Bindable(event="changeSelected")]
            public function get selectedN():String
            {
                return this.selectedItem[idxName];
            }

            public function set selectedN(v:String):void
            {
                var o:Object;
//              for each (var o:Object in dataProvider) @@
                for (var i:int = 0; i < this.dataProvider.length; i++)
                {
                    o = dataProvider.getItemAt(i);
                    if (o[idxName] == v)
                    {
                        this.selectedIndex = i;
                        _selectedN = v;
                        dispatchEvent(new Event("changeSelected"));
                        return; 
                    }

                }
                this.selectedItem = null; // no seleccionar nada (@@?)
                _selectedN = null;
                dispatchEvent(new Event("changeSelected"));
            }

            private function ch():void
            {
                _selectedN = this.selectedItem[idxName];
                dispatchEvent(new Event("changeSelected"));
            }
        ]]>
    </fx:Script>
</s:DropDownList>