MXML иногда сложен, потому что вы никогда точно не знаете, что происходит за кулисами (если вы не используете атрибут -keep и look).
Но мне кажется, что вы никогда не обнуляете ссылку ComboBox.Удаление дочернего элемента контейнера - это не то же самое, что удаление этого экземпляра из памяти.Например, в компоненте «Календарь Flextras» мы нередко удаляем дни из отображения по мере изменения месяцев.В зависимости от месяца может отображаться от 28 до 31 дня.Но если у вас месяц с 31 днем и вы переключаетесь на месяц с 30 днями, мы не аннулируем эти дополнительные дневные средства визуализации, мы просто кешируем их в массиве «unusedDays», а затем мы готовим их для следующегоВремя меняет месяц.
Классы ListBase работают аналогично, и я считаю, что Flex 4 даже имеет свойство с именем useVirtualLayout для управления тем, как эти вещи хранятся в памяти.
Я надеюсь, что это не было слишком длинным или самоубийственным объяснением, и я надеюсь, что оно имело смысл.
Я думаю, вам нужно что-то сделать, чтобы обнулить ComboBox.Первое, что я бы попробовал, это дать ComboBox идентификатор:
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
>
<s:ComboBox id="myComboBox" />
</s:VGroup>
Затем в своем коде ActionScript создайте экземпляр ComboBoxView (не локально для функции):
protected var vew:ComboBoxView = new ComboBoxView();
А затем разберитесь со сборкой мусора следующим образом:
if (hasElement)
{
button.setFocus();
comboBoxContainer.removeAllElements();
comboBoxContainer.myComboBox = null;
comboBoxContainer = null;
hasElement = false;
} else {
var vew:ComboBoxView = new ComboBoxView();
comboBoxContainer.addElement(vew);
hasElement = true;
}
}
Я не проверял себя сам, и моя интуиция заключается в том, что не все эти шаги необходимы;но я подозреваю, что мой подход, вероятно, правильный.