Я хочу, чтобы сцена реагировала каждый раз, когда в определенные объекты вносятся изменения.Есть ли способ написать пользовательское событие? - PullRequest
0 голосов
/ 25 сентября 2011

Я хочу, чтобы сцена реагировала каждый раз, когда в определенные объекты вносятся изменения. Есть ли способ написать пользовательское событие? Я, конечно, мог бы изменить этот объект, но я хотел бы знать, есть ли еще OOP способ сделать это. И события OOP, не так ли?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Пользовательский класс событий можно записать так:

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 голос
/ 26 сентября 2011

Допустим, у вас есть свойство count в каком-то классе. Самый простой способ - сгенерировать установщик и получатель для этого свойства и внутри установщика для отправки какого-либо пользовательского события.

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

Обратите внимание, что если вам нужно значение свойства и у вас нет ссылки на сам объект, вы можете создать событие объекта данных. Для того чтобы этот вид настраиваемого события работал правильно, вам необходимо переопределить метод clone, который используется каждый раз, когда событие отправляется повторно.

Если вы ищете более продвинутый способ «наблюдения» за чем-либо, используйте некоторый пользовательский код, например, http://code.google.com/p/flit/source/browse/trunk/flit/src/obecto/utility/observe/Observe.as?r=190

В любом случае вы должны решить, хотите ли вы изменить свой класс, добавив диспетчер (если ваш класс не является подклассом EventDispatcher ), и отправлять событие или использовать некоторые другие методы. Другой способ - сделать свойство [Bindable] и использовать привязку между вашим свойством и некоторой функцией, чтобы наблюдать, если что-то изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...