在flex组件生命周期中,在我们对components属性进行一些更改之后,invalidation方法会调度对commitProperties
,updateDisplayList
等方法的调用。我需要立即拨打updateDisplayList
。有没有直接的方法来做到这一点。
目前,两个标签在完成循环后同时更改。相反,我需要它像这样工作,首先渲染更新的'myButton1'标签,然后进入循环,然后更新myButton2的标签。我知道,这是弹性赛道问题,但是没有办法实现这个目标吗?
myButton1.label = 'New Label1' ;
// Some logic to forcibly make the screen reflect it
for (var i:int = 0; i < 500 ; i ++){
//a dummy loop
}
myButton2.label = 'New Label2' ;
答案 0 :(得分:2)
您可以使用myButton1.validateNow()
但不建议使用它,因为您最终可能会在同一帧上多次使用相同的组件更新。
答案 1 :(得分:2)
使用validateNow()。但是,我会谨慎使用它。使用invalidateDisplayList()将强制updateDisplayList()在下一个渲染器事件上运行。
每个帧都会发生渲染事件。 Flex默认每秒发生24帧。您确定需要更快地更改这些值吗?
答案 2 :(得分:1)
我会为myButton1设置标签,然后将剩余的代码放入一个单独的方法中,并使用callLater调用该方法:
private function foo():void {
myButton1.label = 'New Label1';
this.callLater(bar);
}
private function bar():void {
for (var i:int = 0; i < 500 ; i ++){ //a dummy loop
}
myButton2.label = 'New Label2';
}
这样myButton1会在进入你的循环之前更新以显示新标签,因为callLater在事件队列被清除之前不会调用bar,这使myButton1有机会更新。
答案 3 :(得分:0)
invalidateDisplayList()或valdiateNow()将为您执行此操作,但过多使用这些将最终导致内存泄漏。