<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
<mx:Script>
<![CDATA[
private var title:String;
private var bNameChanged:Boolean;
public function set Title(value):void
{
if(title != value)
{
title = value;
bNameChanged = true;
this.invalidateProperties();
}
}
override protected function commitProperties():void
{
super.commitProperties();
if(bNameChanged)
{
bNameChanged = false;
lblName.text = title;
}
}
]]>
</mx:Script>
<mx:Label id="lblName" />
</mx:Canvas>
然而,你在用一些Container的时候,还是会遇到null的问题,这又是怎么回事呢?例如,你放两个上面的组件在一个TabNavigate里面。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" >
<mx:TabNavigator>
<local:TestComponent id="test1" Title="test 1" />
<local:TestComponent id="test2" Title="test 2" />
</mx:TabNavigator>
</mx:Application>
试试,保证
Error #1009: 无法访问空对象引用的属性或方法。
这个时候,我开始抱怨了,为什么Flex为什么自己不遵守自己的游戏规则,这里TabNavigator的children还没有创建就会调用,commiteProperties 或者 updateDisplayList方法。这应该是Flex的一个Bug.
现在要解决这个问题就只有让TabNavigator在创建children的时候就要把所有的children都创建。这个时候我们就要关注Container.createPolicy属性了。Container内部的children不是在createChild里面创建的,至于其children的创建时机,就好好看看
ContainerCreationPolicy,而且Container内部的children(即通过mxml加的children)和createChildren里创建的chidren可以理解为不同的类型。
在上面的例子里面的TabNavigator加上 createPolicy = "ALL"所有的文件就解决了。
如果有什么问题,请大家指正.