La clase ArrayCollection de Actionscript 3 incluye una propiedad heredada de ListCollectionView llamada filterFunction con la cual podemos mandar llamar una función que nos devolverá un valor Boolean con el cual evaluaremos si al final el ArrayCollection muestra o no algún elemento.
Antes de mostrar el ejemplo de uso, veamos como tenemos que construir la función que será el valor de la propiedad filterFunction:
Código :
ff(item:Object):BooleanEl nombre de la función lo escoge el desarrollador, sin embargo, el parámetro de entrada y el tipo de dato de regreso si se tienen que especificar según lo indica la documentación. El parámetro de entrada tiene que ser de tipo Object, pues es cada elemento del proveedor de datos que estará mandando a la función para evaluar y el tipo de dato de regreso es de tipo Boolean, pues cuando sea true se agregará al proveedor y cuando sea false se ignorará.
A continuación un ejemplo de como un proveedor de datos tipo ArrayCollection funciona sobre ComboBox, List y DataGrid's:
Para ver el código y descargar el proyecto, click derecho sobre el swf y luego click en View Source. El MXML lo incluyo acá abajo:
Código :
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="400" minHeight="600"
width="400" height="370" xmlns:flexlib="http://code.google.com/p/flexlib/"
creationComplete="this_creationCompleteHandler()" viewSourceURL="srcview/index.html">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
import mx.utils.StringUtil;
//variable en la que guardaremos el token a buscar
private var str2search:String = "";
//dejamos la variable como Bindable para que detecte automaticamente los cambios al proveedor
[Bindable]private var acDataProvider:ArrayCollection;
protected function this_creationCompleteHandler():void
{
//llenamos con informacion falsa el proveedor
//este proveedor tambien podria ser llenado desde una Base de Datos, XML, etc
acDataProvider = new ArrayCollection([
{nombre: "Daniel", nick: "master_of_puppetz", clablevel: 24243},
{nombre: "Alberto", nick: "betornillo", clablevel: 15431},
{nombre: "Juan", nick: "jhonny", clablevel: 76453},
{nombre: "Miguel", nick: "mickey", clablevel: 2151345},
{nombre: "Luis", nick: "lucho", clablevel: 3245},
{nombre: "Carlos", nick: "charly", clablevel: 1235345},
{nombre: "Oscar", nick: "lirask8", clablevel: 3452},
{nombre: "Giovanni", nick: "giolink", clablevel: 1234234}
]);
}
/**
* Este metodo se disparara cada vez que se escriba algo en la caja de texto de busqueda
*/
protected function tiBuscar_changeHandler(event:Event):void
{
//recuperamos el texto de la caja de busqueda y lo convierto a minusculas
str2search = StringUtil.trim(tiBuscar.text).toLowerCase();
//validamos que no este vacia
if (str2search != "")
{
//si no esta vacia, aplicamos la funcion
acDataProvider.filterFunction = busca;
}
else
{
//si esta vacia, quitamos la funcion de filtrado
acDataProvider.filterFunction = null;
}
//despues de cualquier filterFunction, se tiene que aplicar el metodo refresh
acDataProvider.refresh();
}
private function busca(item:Object):Boolean
{
//variable de retorno
var ret:Boolean = false;
//variable que almacenara el nombre de cada indice del elemento
var p:String = "";
//variable que almacenara el valor del elemento
var str:String = "";
//recorro cada indice del elemento
for (p in item)
{
//no quiero que busque en la propiedad mx_internal_uid
if (p != "mx_internal_uid")
{
//recupero el valor del elemento y lo convierto a minusculas
str = String(item[p]).toLowerCase();
//veo si la cadena de busqueda existe en el valor del elemento
if (str.indexOf(str2search) != -1)
{
//si existe, regreso un true para que el elemento sea agregado al proveedor
ret = true;
//termino el ciclo, no hay necesidad de seguir buscando
break;
}
}
}
//regreso el valor Boolean
return ret;
}
]]>
</fx:Script>
<s:HGroup width="100%" horizontalAlign="right">
<flexlib:PromptingTextInput id="tiBuscar" prompt="Buscar..." change="tiBuscar_changeHandler(event)"/>
</s:HGroup>
<s:ComboBox dataProvider="{acDataProvider}" labelField="nick" width="100%"/>
<mx:AdvancedDataGrid dataProvider="{acDataProvider}" width="100%" height="150" designViewDataType="flat">
<mx:columns>
<mx:AdvancedDataGridColumn headerText="Nombre" dataField="nombre"/>
<mx:AdvancedDataGridColumn headerText="Nick" dataField="nick"/>
<mx:AdvancedDataGridColumn headerText="Clablevel" dataField="clablevel"/>
</mx:columns>
</mx:AdvancedDataGrid>
<s:List dataProvider="{acDataProvider}" width="100%" labelField="nick" height="150"/>
</s:Application>Nota: el ejemplo fue hecho en Flash Builder 4 con el Flex SDK 4.0, si se quisiera probar en Flex Builder 3 únicamente se cambian los componentes por los mx y el código en AS3 quedaría igual.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Saludos.
Por eldervaz el 13 de Marzo de 2011
Por Josefina Venegas el 01 de Agosto de 2012
Por Josefina. el 24 de Agosto de 2012