【问题标题】:Why i cannot access a label by id in mxml?为什么我无法通过 mxml 中的 id 访问标签?
【发布时间】:2012-10-16 08:32:45
【问题描述】:

也许这个问题太简单了:

<?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 为空。 但是当我将 s:View 更改为 s:Group 时,一切正常。 为什么?

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

【问题讨论】:

  • 你需要在creationComplete事件被派发后访问label。显示何时调用 setMsg 的代码将有助于调试问题。
  • 好的,准确地说,在应用程序的creationComplete中,我在将其添加为子/元素之前新建了视图和setMsg。

标签: flex4 flex-spark


【解决方案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>

这个例子也是一个不错的选择 - 取决于您的需要。

【讨论】:

  • 我还不了解生命周期,但我尝试了第二种方法,它奏效了。谢谢!
  • 现在我觉得问题还没有完全解决。如果我需要从 creationComplete 中调用 label1.addChild(),仍然有错误。我认为这是同样的问题?
  • 在 MXML 中声明 Label 时,会自动添加。看来您必须添加视图。
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多