我希望舞台在每次对某些对象进行某些更改时做出反应。有没有办法编写自定义事件?

时间:2011-09-25 13:11:38

标签: actionscript-3

我希望舞台在每次对某些对象进行某些更改时做出反应。有没有办法编写自定义事件?我当然可以修改这个对象,但我想知道是否还有OOP方法可以做到这一点。事件是OOP,不是吗?

2 个答案:

答案 0 :(得分:2)

自定义事件类可以这样写:

public class MyEvent extends Event
{
    private var evtData:Object;

    public function MyEvent(type:String, data:Object)
    {
        super(type);
        //fill this.evtData here
    }

    override public function clone():Event
    {
         return new MyEvent(type, evtData);
    }
}

然后通过以下方式发送此事件:

dispatch(new MyEvent("someName", obj))

并像

一样抓住它
myObj.addEventListener("someName", handleMyEvent);
function handleMyEvent(evt:MyEvent):void
{
    //do something with evt
}

答案 1 :(得分:1)

假设您在某些课程中拥有属性count。最简单的方法是为此属性生成setter和getter,并在setter内部调度一些自定义事件。

protected var _count:Number;
public function get count():Number
{
    return _count;
}
public function set count(value:Number):void
{
    _count = value;
    dispatchEvent(new CountEvent(CountEvent.COUNT_CHANGED, value, true));
}

这是自定义事件类:

public class CountEvent extends Event
{
    public static const COUNT_CHANGED:String = "countChanged";

    public var data:Object;

    public function CountEvent(type:String, data:Object, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
        this.data = data;
    }

    override public function clone():Event
    {
        return new CountEvent(type, data, bubbles, cancelable);
    }
}

请注意,如果您需要属性的值并且没有对象本身的引用,则可以创建数据对象事件。为了使这种自定义事件正常工作,您需要覆盖克隆方法,每次重新分派事件时都会使用该方法。

如果您正在寻找更高级的“观察”方法,可以使用一些自定义代码,例如: http://code.google.com/p/flit/source/browse/trunk/flit/src/obecto/utility/observe/Observe.as?r=190

无论哪种方式,您都必须通过添加调度程序(如果您的类不是 EventDispatcher 子类)来决定是否要修改您的类,并调度事件或使用其他一些技术。另一种方法是创建属性[Bindable]并使用属性和某个函数之间的绑定来监视是否有更改。