在工作上碰到一个比较棘手的问题,项目有需要用到配置文件,此文件主要用于版本控制。刚开始的时候用Application的createComplete方法去读取此文件,但由于Flex的初始化过程是先初始化子组件,再初始化父组件。所以如果Application的子组件用到版本信息时,获取的都是null,原因就是还没有读取此文件。
项目中提供了一个解决方案,就是绑定。无论是否已经加载配置文件,先给子组件用的信息的组件绑定值,再把此值暴露给Application,组件先初始化,取到的是空值。再Application调用createComplete,读取配置文件并改变绑定值,说白了其实就是通过值绑定再次改变子组件值。
显而易见的上面的解决方案很明显是一个治标不治本的方案。局限性比较大,并且后期可扩展性非常差。
最后还是回到起点,能不能再任何子组件都没初始化直接先加载配置文件呢?
经过思考和组件重写的启发。
重写一个组件系统依次调用Constructor(构造方法)-->createChildren()-->commitProperties()==>measure()==>updateDisplayList() ;
a,Constructor构造方法,初始化属性,默认值 在这个方法中使用最好。
b,createChildren() 创建子对象,在组件中添加子对象。是使用addChild方法添加子对象
c,commitProperties 用在处理属性值和更新。(多个属性值更新后统一处理入口和单值多次修改后处理入口)
d , measure()设置组件的默认大小(以便Flex布局管理器能正确知道该组件的大小,给其分配适当空间)
e,updateDisplayList()用来重绘组件,子对象布局逻辑等
所以我选择了重写Application的createChildren()方法,在还没有创建子组件之前,先加载配置文件,问题就解决了。
override protected function createChildren():void {
//在此加载配置文件
super.createChildren();
}
花了一上午 flex还是不太熟啊 主要是纠结Application preload了