2012-10-26 47 views
0

也许这个问题太简单了:为什么我无法通过mxml中的id访问标签?

<?xml version="1.0" encoding="utf-8"?> 
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark"> 
    <s:Label id="label1"/> 
    <fx:Script> 
     public function setMsg(msg:String):void 
     { 
      label1.text = msg; 
     } 
    </fx:Script> 
</s:View> 

因为LABEL1为null有一个运行时错误。 但是当我将s:View更改为s:Group时,一切正常。 为什么?

PS:放在SkinableContainer标签也会有这个问题

+0

您需要在'creationComplete'事件分派后访问标签。显示调用setMsg'的代码将有助于调试问题。 –

+0

好的,确切地说,在应用程序的creationComplete中,我新增了视图和setMsg,然后将其添加为子/元素。 – willzeng

回答

1

组件是异步实例化。你可能想尝试这个实现。

<?xml version="1.0" encoding="utf-8"?> 
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark"> 
    <fx:Script> 
    <![CDATA[ 
    private var _message:String, _messageChanged:Boolean; 

    public function get message():String { 
     return _message; 
    } 

    [Bindable("messageChanged")] 
    public function set message(value:String):void { 
     if (_message == value) { 
     return; 
     } 
     _message = value; 
     _messageChanged = true; 
     invalidateProperties(); 
     dispatchEvent(new Event('messageChanged')); 

    } 

    override protected function commitProperties():void { 
     super.commitProperties(); 
     if (_messageChanged) { 
     _messageChanged = false; 
     label1.text = _message; 
     } 
    } 
    ]]> 
    </fx:Script> 

    <s:Label id="label1"/> 
</s:View> 

这是基于Flex组件使用生命周期,它可以让你键入一个位,但有一个模板,如果你不能/不想使用数据,如在这个例子中结合它的确定:

<?xml version="1.0" encoding="utf-8"?> 
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark"> 
    <fx:Script> 

    [Bindable] 
    private var _message:String; 

    public function setMsg(msg:String):void 
    { 
     _message = msg; 
    } 
    </fx:Script> 

    <s:Label id="label1" text="{_message}"/> 
</s:View> 

这个例子可能是一个不错的选择,也取决于您的需求。

+0

我不明白生命周期,但我尝试了第二种方法,它工作。谢谢! – willzeng

+0

现在我认为这个问题没有完全解决。如果我需要从creationComplete中调用label1.addChild(),仍然有错误。我认为这是同样的问题? – willzeng

+0

当标签在MXML中声明时,它会自动添加。看起来你必须添加视图。 –

相关问题