5

データバインディングを理解するのを手伝ってください
クラスで変数を作成するとき:

[Bindable] private var _name:String;

ゲッターとセッターを生成すると、次のようになります。

            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

ここで何が起こっているのかを理解するのに役立つのは、[Bindable] を作成するときに MXML コンパイラが生成するコードです。MXML コンパイラは、独自の getter/setter で [Bindable] プロパティをラップします。これは、新しい値が設定されたときにラッパー セッター メソッドが「propertyChange」イベントを送出できるようにするためです。このイベントは、値が変更されたことをプロパティにバインドする関係者に通知します。

Actionscript のゲッター/セッターは、オブジェクトのプロパティと見なされます (オブジェクトのメソッドではありません)。したがって、ゲッターまたはセッターに [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"));
}

バインド可能なメタデータにはイベント文字列が含まれているため、余分なコードは生成されません。セッターからイベントをディスパッチするのを忘れた場合、コンパイラーは警告を出さないことに注意してください。実際、クラス内のどこからでもカスタム バインディング イベントをディスパッチできます (これは、バインド可能な関数で役立ちます)。

于 2013-05-22T03:31:36.540 に答える