2008-10-16 79 views
2

我在Actionscript中有一个CircleButton类。 我想知道什么时候有人在外面更改了“开”属性。 我尝试聆听'onChange',但它从未击中该事件处理程序。Actionscript组件可以监听它自己的propertyChange事件吗?

我知道我可以写“上”属性为获取/ setter方法,但我喜欢只用[绑定]

一个对象可以不听自己的事件的简单?

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 { 

回答

7

如果在未指定事件类型的情况下使用[Bindable]标签,那么当属性更改其值时,将调度属性为PropertyChangeEvent.PROPERTY_CHANGE的字符串'propertyChange'。

因此,为了能够注册听这种情况下,你需要说:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange); 

之所以侦听器函数是从来没有所谓的是,事件类型是不正确的。

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

为了避免被调用每个可绑定变量,你需要指定在[绑定]标签的事件:手动

[Bindable(event="myOnChangeEvent")] 

并分派该事件当你考虑到该属性正在发生变化(即:在二传手),尽管这似乎并不是你想要做的。

+0

您不需要在方法调用前使用`this`引用。 – 2010-09-22 18:43:18

1

你可以使用BindingUtils.bindSetter()

一个例子是发现here

1

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

Flex绑定所基于的类是BindingUtils和ChangeWatcher。当你在MXML中直接绑定(它只是被编译器转换为AS3)时,它会在场景后面使用这些类来真正建立绑定。我已经在ChangeWatcher中挖掘过,当它查看可能绑定项目的列表时,它只在某个对象实际列为侦听器时才分派。整个绑定系统实际上是事件系统的智能包装。

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

查看此Adobe doc了解AS代码中ChangeWatcher的一些信息。

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

1

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