在flex中迭代dataProvider
我想知道……我想在一个基于DropDownList的Component中迭代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:’three-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> 解决方法
实际上,对于每个循环,循环比正常慢一点.看看
For VS Foreach on Array performance的答案.
要回答你的问题,为什么你的每个循环都不起作用.不幸的是,这种类型的循环仅适用于某些类型的类.据我所知,这些是: >数组 像ArrayList这样的集合类不适用于每个循环,因为它们不是Flash Player中的本机对象(如Array),并且它们不扩展Proxy类. 因此,您可以做的最好的事情是使用简单的for循环,这些循环甚至比每个循环更快. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |