filter data with combobox in flash cs5 as3
Después de haber posteado el ejemplo me di cuenta que el código producía un error al borrar los caracteres con la tecla retroceso solo después de seleccionar un ítem con el teclado, el error en cuestión es del tipo:
RangeError: DataProvider index (1) is not in acceptable range (0 – 0)
Después de darle varias vueltas y no conseguir solucionar el error he optado por programar una segunda alternativa que encontrareis en el segundo ejemplo.
De todas maneras dejo el ejemplo 1 por si a alguien le interesa intentar solucionar el error
Having posted the example I realized that produced an error code to delete characters with the backspace key only after selecting an item with the keyboard, the error in question is the type:
RangeError: DataProvider index (1) is not in acceptable range (0-0)
After giving several laps and not fix the error I get chosen to schedule a second option that you will find in the second example.
Anyway let Example 1 if anyone cares trying to fix the error
Ejemplo 1
(Este ejemplo contiene un error, no usar) – Example 1 (This example contains an error, do not use)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
//Para este ejemplo es necesario colocar en el escenario un componente combobox con nombre de instancia "cmb". import fl.data.DataProvider; //Creamos el array var items:Array = [ {label:"Juan" , data:"00"} , {label:"pepe" , data:"01"}, {label:"sergio" , data:"02"} , {label:"samira" , data:"03"}, {label:"Sandra" , data:"04"} , {label:"Salina" , data:"05"}, {label:"Susana" , data:"06"} , {label:"Sonia" , data:"07"}, {label:"Silvia" , data:"08"} , {label:"Antonio" , data:"09"}, {label:"Alejandro" , data:"10"} , {label:"Alexis" , data:"11"}, {label:"xavirobot" , data:"12"} , {label:"Javier" , data:"13"}, {label:"Jalapeño" , data:"14"} , {label:"Javito" , data:"15"}, {label:"Pepona" , data:"16"} , {label:"Sonajero" , data:"17"}, {label:"Servicio" , data:"18"} , {label:"Sonambulo" , data:"19"}, ]; //Creamos el dataProvider y le asignamos el array var dp:DataProvider = new DataProvider(items); //Asignamos el dataprovider al combobox cmb.dataProvider = dp; //Añadimos los listeners cmb.addEventListener(Event.CHANGE , onCmbEvent , false, 0, true); cmb.addEventListener(MouseEvent.CLICK , onCmbEvent , false, 0, true); function onCmbEvent(e:Event = null):void { if (e.type == "change") { if (cmb.selectedItem == null) { var arr:Array = dp.toArray(); var filteredArr:Array = arr.filter(filterData); cmb.dataProvider = new DataProvider(filteredArr); cmb.drawNow(); if (cmb.text == "") { cmb.open(); } } else {//Si el cmb no es = a null entonces es que se a seleccionado un item //trace(e.target.selectedItem.label+" , "+e.target.selectedItem.data+" , "+e.target.selectedIndex); //or trace(cmb.selectedItem.label+" , "+cmb.selectedItem.data+" , "+cmb.selectedIndex); } } else if (e.type == "click") { cmb.open(); } } function filterData(obj:Object, idx:int, arr:Array):Boolean { var s1:String = cmb.text; var s2:String = obj.label.substr(0,s1.length); if (s1.toLowerCase() == s2.toLowerCase()) { return true; } return false; } |
El ejemplo 2 está basado en el ejemplo 1 anterior, la diferencia reside en que en este caso al filtrar el array no se eliminan los elementos que no coinciden, simplemente se colocan en primer lugar los que coinciden.
The example 2 is based on the example 1 above, the difference is that in this case the filter does not remove array elements that do not match, simply put that first match.
Ejemplo 2
(Ejemplo correcto, usar este) – Example 2 (Example correct, use this)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import fl.data.DataProvider; //Creamos el array var items:Array = [ {label:"Juan" , data:"00"} , {label:"pepe" , data:"01"}, {label:"sergio" , data:"02"} , {label:"samira" , data:"03"}, {label:"Sandra" , data:"04"} , {label:"Salina" , data:"05"}, {label:"Susana" , data:"06"} , {label:"Sonia" , data:"07"}, {label:"Silvia" , data:"08"} , {label:"Antonio" , data:"09"}, {label:"Alejandro" , data:"10"} , {label:"Alexis" , data:"11"}, {label:"xavirobot" , data:"12"} , {label:"Javier" , data:"13"}, {label:"Jalapeño" , data:"14"} , {label:"Javito" , data:"15"}, {label:"Pepona" , data:"16"} , {label:"Sonajero" , data:"17"}, {label:"Servicio" , data:"18"} , {label:"Sonambulo" , data:"19"}, ]; var dp:DataProvider = new DataProvider(items); cmb.dataProvider = dp; cmb.prompt= "Search and Select"; cmb.addEventListener(Event.CHANGE , cmbEvent , false, 0, true); cmb.addEventListener(MouseEvent.CLICK , cmbEvent , false, 0, true); function cmbEvent(e:Event = null):void { if (e.type == "change") { if (cmb.selectedItem == null) { cmb.dataProvider = new DataProvider(ordByTxt(dp.toArray())); if (cmb.text == "") { cmb.open(); } } else { //dispath trace(cmb.selectedItem.label+" , "+cmb.selectedItem.data+" , "+cmb.selectedIndex); } } else if (e.type == "click") { cmb.prompt= ""; cmb.open(); } } function ordByTxt(a:Array):Array { var b:Array = new Array(); var c:int = a.length - 1; for (var n:int=c; n>=0; n--) { var s1:String = cmb.text; var s2:String = a[n].label.substr(0,s1.length); if (s1.toLowerCase() == s2.toLowerCase()) { b.unshift(a[n]); } else { b.push(a[n]); } } return b; } |