Мне интересно ... Я хочу перебрать dataProvider в компоненте, основанном на 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);
}
Но это настолько ужасно, что мне захотелось спросить здесь о другом возможном решении.
ОБНОВИТЬ:
Я постараюсь уточнить ... Я делаю (ну, это уже сделано) компонент, который, как 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>