5

帮助我理解数据绑定
当我在一个类中创建一个变量时:

[Bindable] private var _name:String;

然后生成getter和setter,我得到:

            private var _name:String;

            [Bindable]
            public function get name():String
            {
                return _name;
            }

            public function set name(value:String):void
            {
                _name = value;
            }

为什么它只在get函数上生成标签'[Bindable]'?
对我来说,它似乎应该在 set 函数上,因为我想知道值何时发生变化,而不是刚刚读取值时。

4

1 回答 1

13

可能有助于理解这里发生的事情是 MXML 编译器在您制作 [Bindable] 时将为您生成的代码。MXML 编译器将您的 [Bindable] 属性包装在它自己的 getter/setter 中。这样做是为了让包装器 setter 方法可以在设置新值时调度“propertyChange”事件。此事件通知绑定到属性的各方该值已更改。

Actionscript 中的 Getter/setter 被认为是对象的属性(它们不是对象的方法)。因此,无论您是否将 getter 或 setter 注释为 [Bindable],生成的代码都会做正确的事情。

值得注意的是,您可以通过在属性更改时调度自己的事件来避免生成代码并优化情况。为此,您的 [Bindable] 元数据标记需要包含将在属性更改时调度的事件名称:

private var _name:String;

[Bindable("nameChanged")]
public function get name():String
{
    return _name;
} 

public function set name(value:String)
{
    if (_name == value)
        return;
    _name = value;
    dispatchEvent(new Event("nameChanged"));
}

因为可绑定元数据包含事件字符串,所以不会生成额外代码。请注意,如果您忘记从 setter 分派事件,编译器不会警告您。事实上,您可以从类中的任何位置调度您的自定义绑定事件(这对于可绑定的函数很有用)。

于 2013-05-22T03:31:36.540 回答