2010-04-16 2 views
2

Обратите внимание на программу Flex ниже (я использую Flex Builder 3 w/3.5 SDK). Второе поле со списком зависит от первого. Если выбрано «первое имя», вам разрешено выбирать «фамилию». Если выбрано «none», вам не разрешено выбирать фамилию, а скорее предлагается выбрать имя.Почему этикетки таинственно исчезают из ComboBox в Flex 3?

Чтобы увидеть загадочную проблему исчезающих меток, запустите эту программу и выберите имя. Затем выберите фамилию. Все хорошо. Затем выберите «none» в первом поле со списком. Приглашение второй сводки изменится, и последние имена будут удалены. Все по-прежнему хорошо. Затем повторите попытку выбора первого и последнего имени. Вы увидите, что после выбора первого имени последние имена не отображаются, хотя пробелы для них выполняются (и если вы отлаживаете программу, в датапарадресе появляются правильные данные).

Этот «ошибка» убивает меня внутри внутри весь день. Проект, в котором я реализую это поведение, довольно немного сложнее, но этот пример в основном иллюстрирует, что происходит. Это ошибка в Flex, или я делаю что-то неправильно?

Спасибо!

<?xml version="1.0" encoding="utf-8"?> 

<mx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     public var cbCompanyDP:ArrayCollection = new ArrayCollection([ { firstName: "None", data: 0 }, 
                     { firstName: "Bob", data: 1 }, 
                     { firstName: "Bart", data: 2 } ]); 

     [Bindable] 
     public var cbEmployeeDP:ArrayCollection = new ArrayCollection(); 

     public var employees:ArrayCollection = new ArrayCollection([ { lastName: "Smith" }, 
                     { lastName: "Smyth" }, 
                     { lastName: "Smick" }, 
                     { lastName: "Smack" } ]); 

     [Bindable] 
     public var prompt:String = "Choose First Name first"; 

     public function cbFirstNameChange(value:int):void 
     { 
      if (value == 0) 
      { 
       employees.removeAll(); 
       setEmpDP(employees); 
       prompt = "Choose First Name first"; 
      } 
      else 
      { 
       setEmployees(); 
       setEmpDP(employees); 
       prompt = "Now choose Last Name"; 
      } 
     } 

     private function setEmpDP(ac:ArrayCollection):void 
     { 
      cbEmployeeDP = ac; 
     } 

     private function setEmployees():void 
     { 
      employees = new ArrayCollection([ { lastName: "Smith" }, 
               { lastName: "Smyth" }, 
               { lastName: "Smick" }, 
               { lastName: "Smack" } ]); 
     } 
    ]]> 
</mx:Script> 

<mx:HBox> 

    <mx:ComboBox dataProvider="{cbCompanyDP}" 
     id="cbFirstName" 
     labelField="firstName" 
     width="200" 
     change="cbFirstNameChange(cbFirstName.selectedItem.data)" 
     prompt="Choose a first Name" /> 

    <mx:ComboBox dataProvider="{cbEmployeeDP}" 
     id="cbLastName" 
     labelField="lastName" 
     width="200" 
     prompt="{prompt}" /> 
</mx:HBox> 

+0

Чувак! Я попробовал вас pgm, и его показ не был такой проблемой в машине ma! – Anoop

+0

Ну, это обескураживает. Какую версию Flex SDK вы используете? Какая версия Flash Player? – eterps

ответ

2

Проблема здесь состоит в том, что существует привязка отсутствует. Если вы измените dataProvider из ComboBox, он не изменит dataProvider сгенерированного выпадающего списка. Таким образом, поле знает новый список, но выпадающий элемент все еще обрабатывает старый. Чтобы исправить это, вы должны подклассифицировать ComboBox и переопределить набор dataProvider и получить dataProvider (для симметрии).

override protected function set dataProvider (value:Object):void { 
    super.dataProvider=value; 
    if(dropdown != null) 
    super.dropdown.dataProvider=value; 
} 

также обновить ширину выпадающего списка в случае, если ширина ComboBox изменилось, также необходимо переопределить другую функцию:

override protected function updateDisplayList 
    (unscaledWidth:Number, unscaledHeight:Number):void { 
    super.updateDisplayList (unscaledWidth, unscaledHeight); 
    if (dropdown != null) 
    dropdown.width = unscaledWidth; 
} 

Таким образом, он работает как положено. , если вы хотите, вы можете в установленном узле проверить, является ли selectedIndex равным -1 (который в редактируемом поле означает, что есть введенное вручную содержимое), сохраните его из super.text и верните его в super.text (и установите index to -1 снова) после того, как вы установили новый dataProvider. Иначе текст в поле ввода будет потерян или заменен первым элементом списка.

0

Я попытался с другим SDK (3.2 и 4), и она работает на, так что я предполагаю, что это ошибка от 3,5

0

Ну это появляется два ответа: Да, это ошибка в Flex 3.5 sdk, поскольку этого не происходит в 4 (я не тестировал другие SDK). Однако, поскольку я не могу изменить средний проект SDK, обходной путь возник в другом вопросе: Flex 3.5.0; Update ComboBox display list upon dataprovider change

Спасибо за вход каждого.

2

не установлен новый ArrayCollection к DataProvider в Flex 3.5, если поставщик данных уже был установлен - набор dataProvider.source (не сделать новую ссылку)

+0

Это сработало для меня и было намного проще, чем изменить все экземпляры ComboBox на пользовательские компоненты. – Glenn

1

У меня была такая же проблема, только вчера. Кажется, это ошибка в 3.5. Это происходит, когда вы назначаете новый объект ArrayCollection для объекта, связанного в combobox. Если вы щелкните в поле со списком, он обновится и покажет реальный контент.

Решение этого вопроса в 3.5: не назначать новое arraycollection привязанной переменной. Вы должны установить только источник как сказал антон, или использовать добавление/удаление/addAll Пункта methods.Something, как это должно работать также:

private function setEmpDP(ac:ArrayCollection):void 
    { 

     cbEmployeeDp.removeAll(); 
     cbEmployeeDP.addAll(ac); 
    } 
Смежные вопросы