2012-10-26 80 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中聲明時,它會自動添加。看起來你必須添加視圖。 –

相關問題