Просто интересно, сталкивался ли кто-нибудь с этим и исправил ли он.
Вот как воспроизвести:
Создание навигатора вкладок (или стека просмотра, и т. Д.) И добавление пары вкладок.
На вкладке добавьте обработчик события шоу. Внутри обработчика событий вызовите invalidateProperties () и invalidateDisplayList () одного из дочерних элементов вашей вкладки. Поместите точку останова в childs commitProperties () и updateDisplayList (). Вы заметите, что updateDisplayList () вызывается перед commitProperties (), что приводит к некорректному поведению.
Я заметил эту проблему, когда устанавливал поставщик данных DataGrid из обработчика шоу. Установка dataProvider приводит к тому, что сетка делает недействительными как свойства, так и displayList, сначала вызывается updateDisplayList (), а затем commitProperties (), что приводит к тому, что сетка не обновляет строки.
Похоже, корень проблемы в том, что событие show отправляется из цикла validateDisplayList () LayoutManagers, поэтому аннулирование дочернего объекта из обработчика show приводит к немедленному вызову updateDisplayList ().
Я знаю, что могу использовать callLater () в обработчике шоу или нескольких других хакерских решениях, но я бы предпочел исправить причину проблемы, так как я не хочу находить / исправлять эту проблему каждый раз, когда кто-то использует шоу событие и плохие вещи случаются.
Я рассматриваю возможность изменения UIComponent.setVisible (), который отправляет событие show, и использует callLater () для dispatchEvent (), чтобы событие show не получало отправленный цикл проверки в середине, если у кого-то нет лучшей идеи.
<mx:Script>
<![CDATA[
import mx.controls.Label;
private var tabLabel:Label;
private function onCreationComplete():void
{
var ifactory:IFactory = TestLabel;
tabLabel = Label(ifactory.newInstance());
tab1.addChild(tabLabel);
}
private function onTab1Show():void
{
tabLabel.invalidateProperties();
tabLabel.invalidateDisplayList();
}
]]>
</mx:Script>
<mx:Component id="TestLabel">
<mx:Label text="Test">
<mx:Script>
<![CDATA[
override protected function commitProperties():void
{
super.commitProperties();
}
override protected function updateDisplayList(w:Number, h:Number):void
{
super.updateDisplayList(w, h);
}
]]>
</mx:Script>
</mx:Label>
</mx:Component>
<mx:TabNavigator height="200" width="200" creationComplete="onCreationComplete()">
<mx:Canvas id="tab1" height="100%" width="100%" label="Tab 1" show="onTab1Show()" />
<mx:Canvas height="100%" width="100%" label="Tab 2" />
</mx:TabNavigator>