【问题标题】:Iterating a dataProvider in flex在 flex 中迭代 dataProvider
【发布时间】:2010-12-01 19:05:12
【问题描述】:

我想知道...我想在一个基于 DropDownList 的组件中遍历一个 dataProvider。 首先,它不起作用(它已编译,但从未迭代)是:

var o:Object;
for each (var o:Object in dataProvider)
{
}

我猜它不起作用,因为 IList 不提供对象,或者有人能够轻松解释的东西。

我尝试了一些从效率角度来看看起来很糟糕的方法,但它确实有效。就是这样:

for (var i:int = 0; i < dataProvider.length; i++)
{
   o = dataProvider.getItemAt(i);
}

但这太可怕了,我很想在这里询问另一种可能的解决方案。

更新:

我会尝试详细说明...我正在制作(嗯,它已经制作好了)一个类似于 DropDownList 的组件,它是可绑定的,而不是索引(如 selectedIndex="@{variable}" ),但是是 ArrayCollection 内部的一个变量的值。

假设您有一个带有两个对象的 dataProvider:{a:'5', nmb:'five', blabla:'cinco'}{a:'39', nmb:'thirty-nine', blabla:'treinta y nueve'}

这个组件,如果这样声明:

<com:ddListN idxName="a" selectedN="@{val}" labelField="nmb">

是否使用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>

【问题讨论】:

  • 我很惊讶第一种方法不起作用。我也很惊讶您在使用第二种方法时遇到性能问题。我本来希望第二个效率更高,因为它是循环开始时“已知”的循环迭代次数。也许您可以详细说明您正在尝试做什么和/或提供一个可运行的示例来解释您的问题。
  • 好吧,如果第一种方法有效,也许第二种方法仍然比第一种方法更好......我会尝试详细说明......

标签: apache-flex iterator dataprovider


【解决方案1】:

实际上for each 循环比普通的for 循环慢一点。看看For VS Foreach on Array performance的答案。

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

  • Array
  • Vector
  • XML
  • XMLList
  • 以及扩展 Proxy 的类,这些类实现了 for each 循环所需的功能。 ListCollectionView 及其子类 ArrayCollectionXMLListCollection 是我所知道的唯一。

ArrayList 这样的集合类不适用于for each 循环,因为它们不是Flash Player 中的本机对象(如Array)并且它们不扩展Proxy 类。

因此,您能做的最好的事情是使用简单的for 循环,这些循环甚至比for each 循环更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多