У меня есть ComboBox, и поставщиком данных является ArrayCollection трех значений: CA - Калифорния, NY - Нью-Йорк, TX - Техас.С поведением по умолчанию, когда я начинаю печатать в ComboBox, он пытается сопоставить значение с начала строки, поэтому, если я начну печатать TX, это вызовет TX - Техас.
Я хочу иметь возможностьискать в любой части строки, а не только в начале, поэтому, если я наберу «xas», она отфильтрует выбор и покажет только TX - Texas.На форумах Adobe есть очень полезный пост здесь о том, как это сделать, изменив функцию фильтра в ArrayCollection, которая предоставляет данные для ComboBox, и я адаптировал их, но у меня возникла небольшая проблема с этим.
Если пользователь выбирает значение, а затем пытается ввести в новый текст, первая буква, введенная в ComboBox, не отображается.
1) Выберите значение CA - California в ComboBox
2) Выделите текст и нажмите «n» на клавиатуре
3) Можно ожидать, что текстовое поле будет заполнено «n», но текстовое поле останется пустым
Что может бытьвызывая эту проблему?Это происходит, только если у вас уже выбрано значение.Если вы начинаете с пустого ComboBox, он работает как положено.
<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}"/>