2

ActionscriptにCircleButtonクラスがあります。誰かが外部から「on」プロパティを変更したのはいつか知りたいです。'onChange'を聴いてみましたが、そのイベントハンドラーにヒットすることはありません。

'on'プロパティをget/setterとして記述できることは知っていますが、[Bindable]を使用するだけの単純さが気に入っています。

オブジェクトはそれ自体のイベントをリッスンできませんか?

public class CircleButton extends UIComponent

{
    [Bindable]
    public var on:Boolean;

    public function CircleButton()
    {
        this.width = 20;
        this.height = 20;

        graphics.beginFill(0xff6600, 1);
        graphics.drawCircle(width/2, height/2, width/2);
        graphics.endFill();

        this.addEventListener(MouseEvent.ROLL_OVER, rollover);  
        this.addEventListener(MouseEvent.ROLL_OUT, rollout);        

        this.addEventListener('onChange', onOnChange);
    }       

    private function onOnChange(event:PropertyChangeEvent):void {
4

4 に答える 4

7

イベント タイプを指定せずに [Bindable] タグを使用すると、プロパティの値が変更されると、次のタイプのイベントが送出されます: PropertyChangeEvent.PROPERTY_CHANGE (文字列「propertyChange」)。

したがって、そのイベントをリッスンするために登録できるようにするには、次のように言う必要があります。

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);

リスナー関数が呼び出されなかった理由は、イベント タイプが正しくなかったためです。

リスナー メソッドは、「on」だけでなく、クラスで Bindable としてマークされた変数のいずれかが変更されたときに呼び出されることに注意してください。このイベントには、どの変数が変更されたかを示す「プロパティ」と呼ばれるプロパティが付属しています。

各 Bindable 変数で呼び出されないようにするには、[Bindable] タグでイベントを指定する必要があります。

[Bindable(event="myOnChangeEvent")]

プロパティが変更されていると思われる場合(つまり、セッターで)、そのイベントを手動でディスパッチしますが、それはあなたがやりたいことではないようです。

于 2008-10-18T19:04:23.753 に答える
1

何かが変数にバインドできるからといって、何かが変数にバインドされているとは限りません。これはイベント システムに少し似ています。何かがイベントをディスパッチできるからといって、何かがリッスンしているとは限りません。

Flex バインディングのベースとなるクラスは、BindingUtils と ChangeWatcher です。MXML (コンパイラによって AS3 に変換されるだけ) で直接バインドすると、これらのクラスをバックグラウンドで使用して、実際にバインドを確立します。以前に ChangeWatcher を掘り下げたことがありますが、潜在的にバインド可能なアイテムのリストを調べたときに、オブジェクトが実際にリスナーとしてリストされている場合にのみディスパッチされます。バインディング システム全体は、実際にはイベント システムのスマート ラッパーです。

MXML ではなく AS3 でのバインドのセマンティクスは異なります。MXML でのみ機能する微妙な違い (オブジェクトの子プロパティへのチェーンなど) は、動作を複製するために AS3 で作業する必要があります (おそらく MXML から AS3 へのコード生成の結果)。

AS コードでの ChangeWatcher の詳細については、このAdob​​e docを参照してください。

個人的には、MXML 以外のバインディングは使いにくいと感じているので使用しません。代わりにセッター関数を作成することをお勧めします。これは、より予測可能である (そしてパフォーマンスが高い可能性が高い) ためです。また、ChangeWatcher と BindingUtils のソース コードを一読することをお勧めします。これは間違いなく、おそらく最も高度な AS3 の一部です。

于 2008-10-17T06:51:41.707 に答える
1

BindingUtils.bindSetter() を使用できます

例はここにあります

于 2008-10-17T02:52:02.610 に答える
1

私のお気に入りのアプローチの 1 つは、ここにある Observe クラスです。基本的にはセッターを使用していますが、繰り返し可能な優れたアプローチです。

于 2008-10-17T14:46:47.083 に答える