4

私は疑問に思っています... 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 内の変数の値に。

と の 2 つのオブジェクトを持つ 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値を idxName で定義された変数と比較して、DropDownList を適切なインデックスに設定/取得するために使用します。

さて、これはコード全体です(それほど多くはありません):

<?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>
4

1 に答える 1

8

実際for each、ループは通常のループよりも少し遅くなりforます。For VS Foreach on Array performanceへの回答をご覧ください。

あなたの質問に答えるために、for eachループが機能しない理由を教えてください。残念ながら、このタイプのループは特定のタイプのクラスでしか機能しません。私が知る限り、それらは次のとおりです。

  • Array
  • Vector
  • XML
  • XMLList
  • ループProxyに必要な機能を実装する拡張クラス。とそのサブクラスは、私が知っている唯一のものです。for eachListCollectionViewArrayCollectionXMLListCollection

のようなコレクション クラスは、Flash Player のネイティブ オブジェクトではなく ( など)、クラスを拡張しないためArrayListfor eachループでは機能しません。ArrayProxy

したがって、できる最善の方法は単純なループを使用することでforあり、それらのループはループよりもさらに高速ですfor each

于 2010-12-01T21:59:09.197 に答える