0

多分この質問は単純すぎます:

<?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に入れると、この問題も発生します

4

1 に答える 1

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>

必要に応じて、この例も良い選択かもしれません。

于 2012-10-26T13:22:48.053 に答える