Apache flex Actionscript组件能否侦听自己的propertyChange事件?

Apache flex Actionscript组件能否侦听自己的propertyChange事件?,apache-flex,actionscript,event-handling,Apache Flex,Actionscript,Event Handling,我在Actionscript中有一个CircleButton类。 我想知道外部有人何时更改了“on”属性。 我试着听“onChange”,但它从来没有击中那个事件处理程序 我知道我可以将“on”属性作为get/setter编写,但我喜欢使用[Bindable]的简单性 一个对象不能监听它自己的事件吗 public class CircleButton extends UIComponent { [Bindable] public var on:Boolean; pub

我在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 {

您可以使用BindingUtils.bindSetter()


一个例子被发现。

仅仅因为某个东西可以绑定到变量,并不意味着某个东西绑定到变量。这有点像事件系统——仅仅因为某些东西可以发送事件并不意味着任何东西都在侦听

Flex绑定所基于的类是BindingUtils和ChangeWatcher。当您直接在MXML中绑定(编译器刚刚将其转换为AS3)时,它会在后台使用这些类来实际建立绑定。我以前在ChangeWatcher中搜索过,当它查看潜在可绑定项的列表时,它只会在某个对象实际列为侦听器时发送。整个绑定系统实际上是一个围绕事件系统的智能包装器

AS3而不是MXML中绑定的语义是不同的。仅在MXML中工作的细微差异(如链接到对象的子属性)需要在AS3中工作以复制行为(可能是MXML到AS3之间代码生成的结果)

看看这个,了解一下AS代码中ChangeWatcher的一些信息


就我个人而言,我不在MXML之外使用绑定,因为我觉得它很笨拙。我建议您编写一个setter函数,因为它更容易预测(而且很可能具有更好的性能)。我还建议您通读ChangeWatcher和BindingUtils的源代码。这绝对是你可能会读到的最高级的AS3。我最喜欢的方法之一是发现的Observe类。它本质上是使用setter,但这是一种很好的可重复方法。

如果使用[Bindable]标记而不指定事件类型,那么当属性更改其值时,将调度一个类型为PropertyChangeEvent.property_CHANGE的事件,即字符串“propertyChange”

因此,为了能够注册收听该活动,您需要说:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);
从未调用侦听器函数的原因是事件类型不正确

请注意,当类中标记为可绑定的任何变量发生更改时,将调用侦听器方法,而不仅仅是“on”。此事件附带一个名为“property”的属性,该属性指示更改了哪个变量

为了避免对每个可绑定变量调用,您需要在[Bindable]标记中指定一个事件:

[Bindable(event="myOnChangeEvent")]

当您认为属性正在改变(即:在SETER中)时,手动发送事件(虽然这不是您想做的事情)。

您不需要在方法调用前面的<代码>这个< /代码>引用。您不需要,但它是为了清楚地添加添加监听器的人而添加的。