huf*_*uff 4 apache-flex iterator dataprovider
我想知道......我想在一个基于DropDownList的Component中迭代dataProvider.第一件事,它不起作用(它编译,但从未迭代),是:
var o:Object;
for each (var o:Object in dataProvider)
{
}
Run Code Online (Sandbox Code Playgroud)
我想它不起作用,因为IList不提供对象,或者某些人能够轻松解释的东西.
从效率的角度来看,我尝试了一些看起来很糟糕的东西,但它确实有效.就是这个:
for (var i:int = 0; i < dataProvider.length; i++)
{
o = dataProvider.getItemAt(i);
}
Run Code Online (Sandbox Code Playgroud)
但它太可怕了,我觉得很想在这里询问另一种可能的解决方案.
更新:
我将尝试详细阐述......我正在制作(好吧,它已经成为)一个组件,就像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">
Run Code Online (Sandbox Code Playgroud)
用于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>
Run Code Online (Sandbox Code Playgroud)
实际上,for each循环比正常for循环慢一点.看看For VS Foreach on Array性能的答案.
要回答你的问题,为什么你的for each循环不起作用.不幸的是,这种类型的循环仅适用于某些类型的类.据我所知,这些是:
ArrayVectorXMLXMLListProxy实现for each循环所需的函数.ListCollectionView及其子类ArrayCollection,XMLListCollection是我所知道的唯一.集合类ArrayList不适用于for each循环,因为它们不是Flash Player中的本机对象(如Array),并且它们不扩展Proxy类.
所以,你能做的最好的事情就是使用简单的for循环,这些循环甚至比for each循环更快.
| 归档时间: |
|
| 查看次数: |
6536 次 |
| 最近记录: |