Может ли компонент Actionscript прослушивать свои собственные события propertyChange? - PullRequest
2 голосов
/ 17 октября 2008

У меня есть класс CircleButton в Actionscript. Я хочу знать, когда кто-то внешне изменил свойство 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 ]

7 голосов
/ 18 октября 2008

Если вы используете тег [Bindable] без указания типа события, то когда свойство изменяет свое значение, будет отправлено событие типа: PropertyChangeEvent.PROPERTY_CHANGE, которое является строкой 'propertyChange'.

Поэтому, чтобы иметь возможность зарегистрироваться для прослушивания этого события, вы должны сказать:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange);

Причина, по которой ваша функция слушателя никогда не вызывалась, заключается в том, что тип события был неправильным.

Обратите внимание, что метод слушателя будет вызываться, когда изменяется любая из переменных, помеченных как Bindable в вашем классе, а не только «on». Это событие имеет свойство под названием «свойство», которое указывает, какая переменная была изменена.

Чтобы избежать вызова для каждой переменной Bindable, вам нужно указать событие в теге [Bindable]:

[Bindable(event="myOnChangeEvent")]

и отправьте это событие вручную, если учесть, что свойство изменяется (т. Е. В установщике), хотя, похоже, это не то, что вы хотели сделать.

1 голос
/ 17 октября 2008

То, что что-то можно связать с переменной, не означает, что что-то связано с переменной. Это немного похоже на систему событий - только то, что что-то может отправлять событие, не означает, что что-то слушает.

Классами, на которых основано связывание Flex, являются BindingUtils и ChangeWatcher. Когда вы привязываете напрямую в MXML (который компилятор просто преобразует в AS3), он использует эти классы за сценой для фактического установления привязки. Я копался в ChangeWatcher и раньше, и когда он просматривает список потенциально привязываемых элементов, он отправляет его только в том случае, если какой-то объект действительно указан в качестве слушателя. Вся система привязки фактически является умной оболочкой для системы событий.

Семантика связывания в AS3 вместо MXML различна. Тонкие различия (например, сцепление с дочерними свойствами объектов), которые просто работают в MXML, требуют работы в AS3 для дублирования поведения (возможно, в результате генерации кода между MXML и AS3).

Взгляните на этот Adobe doc , чтобы получить небольшую информацию о ChangeWatcher в коде AS.

Лично - я не использую привязку за пределами MXML, так как считаю ее неуклюжей. Я бы посоветовал вам написать функцию-установщик, поскольку она более предсказуема (и, скорее всего, эффективна). Я также предлагаю вам прочитать исходный код для ChangeWatcher и BindingUtils. Это определенно один из самых продвинутых AS3, которые вы, вероятно, читаете.

1 голос
/ 17 октября 2008

Один из моих любимых подходов - класс Observe, который можно найти здесь . По сути, он использует сеттер, но это хороший повторяемый подход.

1 голос
/ 17 октября 2008

Вы можете использовать BindingUtils.bindSetter ()

Пример найден здесь .

...