2012-05-30 12 views
2

Я пытаюсь установить selectedItem на comboBox (mx). Ниже приводится код:Установить SelectedItem в Flex Combobox, когда Combobox не отображается?

callLater(function():void { 
     if (comboBox.dataProvider && comboBox.dataProvider.length > 0) { 
      comboBox.selectedItem = comboBox.dataProvider.getItemAt(0); 
     } 
}); 

EDIT: Я программно создать ComboBoxes:

var comboBox:ComboBox = new ComboBox(); 

Это прекрасно работает и устанавливает SelectedItem к первому элементу от поставщика данных - , но только если выпадающий является отображается на экране и не скрывается в складной группе.

У меня есть ситуации, когда я могу иметь выпадающий заключенный внутри группы складном (мой собственный компонент) и не отображается до тех пор, сложенную группа не расширяется (см изображения ниже)

Первое изображение: Когда группы свернуты и выпадающий не отображается, но создается collapsed_groups

Второе изображение: когда свернутый группа расширяется, чтобы отобразить выпадающий - обратите внимание, что первый элемент в DataProvider не выбран в качестве SelectedItem

Expanded Group

следующая строка всегда выполняется

comboBox.selectedItem = comboBox.dataProvider.getItemAt(0); 

Но первый элемент не выбран в том случае, когда выпадающий заключен в свернутой группе - отлично работает, когда выпадающий заключен в расширенной группе.

Я думаю, что это ошибка в flex - если кто-то не подумает иначе?

ответ

2

Проблема заключается в том, что вы не можете знать, когда объект добавляется к сцене. Как вы уже упоминали, элемент не будет установлен, если компонент не отображается.

Creation Complete не вызывается несколько раз, поэтому вам нужен другой способ сделать это. Чтобы убедиться, что элемент настроен на компонент после его повторного просмотра, просто вызовите метод callLater в самом комбоблоке (тогда метод вызывается только после того, как компонент был отображен снова, вместо всего приложения)

var comboBox:ComboBox = new ComboBox(); 

comboBox.callLater(function():void { 
    if (comboBox.dataProvider && comboBox.dataProvider.length > 0) { 
     comboBox.selectedItem = comboBox.dataProvider.getItemAt(0); 
    } 
}); 
2

Я видел эту проблему в прошлом. Я обхожу его, установив глобальную переменную и установив выбранный элемент comboBox в значение переменной.

Например:

private var comboBoxValue:int = 0; 

Тогда на ваш COMBOBOX:

<mx:ComboBox id="myComboBox" updateComplete="{myComboBox.selectedItem = comboBoxValue}" change="functionToChangeVariable()"/> 
+0

Я создаю ComboBoxes программно - есть ли способ обработать updatecomplete в этом случае? – Ved

+2

Вы можете добавлять и удалять прослушиватели событий, например: 'comboBox.addEventListener (FlexEvent.UPDATE_COMPLETE, handleUpdateComplete);' – Marjolein

+1

Спасибо @MarjoleinKleinman - вот что я сделал. Я использовал CREATION_COMPLETE, потому что на UPDATE_COMPLETE я не могу выбрать какое-либо другое значение из Combo (при выборе, UPDATE_COMPLETE снова срабатывает и снова выбирает первый элемент) – Ved

0

Я работаю с выпадающим списком, поскольку Flex SDK 3. Я использовал для установки SelectedIndex вместо SelectedItem. Вид обходного пути, но всегда работает для меня:

<ComboBox id="comboBox" 
    dataProvider="{model.dataProvider}" 
    selectedIndex="{getItemIndex(comboBox.dataProvider, model.currentItem}" 
    change="model.currentItem = comboBox.selectedItem"/> 
    //getItemIndex - function with simple list.getItemIndex() 

Работает как для mx, так и для искры.

+0

selectedIndex тоже не работает. Проблема в том, что combobox не отображается, когда макет визуализируется, только при расширении сбрасываемой группы отображается combobox – Ved

0

я мог бы решить эту проблему, установив выбранный элемент на CREATION_COMPLETE следующим образом:

comboBox.addEventListener(FlexEvent.CREATION_COMPLETE, function(){ 
     comboBox.selectedItem = comboBox.dataProvider.getItemAt(0); 
});