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);

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

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

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

[Bindable(event="myOnChangeEvent")]

并在您认为属性正在更改(即:在 setter 中)时手动调度该事件,尽管这似乎不是您想要做的。

于 2008-10-18T19:04:23.753 回答
1

你可以使用 BindingUtils.bindSetter()

在这里可以找到一个示例。

于 2008-10-17T02:52:02.610 回答
1

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

Flex 绑定所基于的类是 BindingUtils 和 ChangeWatcher。当您直接在 MXML 中绑定(编译器将其转换为 AS3)时,它会在后台使用这些类来实际建立绑定。我之前在 ChangeWatcher 中进行了研究,当它查看潜在可绑定项的列表时,它仅在某些对象实际上被列为侦听器时才调度。整个绑定系统实际上是事件系统的智能包装器。

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

查看这个Adob​​e 文档,了解有关 AS 代码中 ChangeWatcher 的一些信息。

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

于 2008-10-17T06:51:41.707 回答
1

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

于 2008-10-17T14:46:47.083 回答