I have a ComboBox, and the data provider is an ArrayCollection of 3 values: CA - California, NY - New York, TX - Texas. With the default behavior, when I start typing in a ComboBox, it will try to match the value from the beginning of the line, so if I start typing in TX, it will output TX-Texas.
I want to be able to search in any part of the string, not just from the beginning, so if I type "xas" it will filter the selection and display only TX-Texas. There is a very useful post on the Adobe forums on how to do this by changing the filter function to ArrayCollection, which provides data for the ComboBox and I adapted it, but I have a little problem with it.
If the user selects a value and then tries to enter new text, the first letter entered in the ComboBox is not displayed.
1) Select CA - California in ComboBox
2) Highlight the text and press "n" on the keyboard
3) You expect to see the text field filled with "n", but the text field remains empty
What could be causing this problem? This only happens if you have already selected a value. If you start with a clean ComboBox, it works as expected.
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
import spark.events.TextOperationEvent;
[Bindable]
public var arrC:ArrayCollection = new ArrayCollection([{label:'CA - California'},{label:'NY - New York'},{label:'TX - Texas'}]);
private function changeHandler(e:*):void
{
if (arrC.filterFunction != doFilter)
arrC.filterFunction = doFilter;
arrC.refresh();
}
private function doFilter(item:Object):Boolean
{
if(String(item.label).toLowerCase().indexOf(cb.textInput.text.slice(0 ,cb.textInput.selectionAnchorPosition).toLowerCase())>-1)
{
return true;
}
return false;
}
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
cb.textInput.addEventListener(TextOperationEvent.CHANGE,changeHandler );
}
]]>
</fx:Script>
<s:ComboBox id="cb" dataProvider="{arrC}"/>
source
share