ActionScript组件可以监听自己的propertyChange事件吗?

时间:2008-10-16 23:41:55

标签: flex actionscript event-handling

我在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 个答案:

答案 0 :(得分:7)

如果使用[Bindable]标记而未指定事件类型,则当属性更改其值时,将调度类型为:PropertyChangeEvent.PROPERTY_CHANGE的事件,即字符串'propertyChange'。

因此,为了能够注册听取该事件,您需要说:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);

从未调用过侦听器函数的原因是事件类型不正确。

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

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

[Bindable(event="myOnChangeEvent")]

并在您考虑该属性正在发生变化时手动调度该事件(即:在setter中),尽管这似乎不是您想要做的事情。

答案 1 :(得分:1)

您可以使用BindingUtils.bindSetter()

找到一个例子here

答案 2 :(得分:1)

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

Flex绑定所基于的类是BindingUtils和ChangeWatcher。当您直接在MXML中绑定(由编译器转换为AS3)时,它会使用场景后面的这些类来实际建立绑定。我之前和之后在ChangeWatcher中进行了挖掘,当它查看可能可绑定的项目列表时,如果某个对象实际上被列为侦听器,它只会调度。整个绑定系统实际上是围绕事件系统的智能包装器。

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

在AS代码中查看有关ChangeWatcher的一些信息,请查看此Adobe doc

个人 - 我不使用MXML之外的绑定,因为我觉得它很笨拙。我建议你写一个setter函数,因为它更可预测(很可能是高性能的)。我还建议您阅读ChangeWatcher和BindingUtils的源代码。这绝对是你可能阅读的最先进的AS3之一。

答案 3 :(得分:1)

我最喜欢的方法之一是找到here的观察类。它本质上是使用setter,但它是一种很好的可重复方法。