Как избежать пинания PropertyChangeEvent для объекта, пока все атрибуты не будут назначены во Flex - PullRequest
0 голосов
/ 14 февраля 2011

Я хочу зафиксировать изменение свойства элемента следующим образом

myItem.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE,listener);

protected function listener(event:PropertyChangeEvent):void  {
   ...
}

проблема, с которой я сталкиваюсь, заключается в том, что когда я присваиваю несколько значений объекту "myItem", прослушиваемое отключаетсямногократно.например,

Если я сделаю:

myItem.x = new_x;
myItem.y = new_y;
....

, слушатель запускается каждый раз, когда происходит изменение (после вызова первой строки, затем после вызова второй строки ... и т. д.).Как предотвратить это, чтобы сохранить обработку / память и избежать несогласованности.

Ответы [ 4 ]

1 голос
/ 15 февраля 2011

Вы можете сделать это "хакерским" способом.Пример следует ...

BindingObject.as:

package bindings
{
    import mx.core.EventPriority;
    import mx.events.PropertyChangeEvent;
    import mx.events.PropertyChangeEventKind;

    [Bindable]
    public class BindingObject
    {
        private var inEditMode : Boolean = false;

        public function BindingObject()
        {
            this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onPropertyChange, false, EventPriority.BINDING - 1);
        }

        private function onPropertyChange(event : PropertyChangeEvent) : void
        {
            if (inEditMode)
                event.stopImmediatePropagation();   
        }

        public function beginEdit() : void
        {
            inEditMode = true;
        }

        public function endEdit() : void
        {
            inEditMode = false;
            this.dispatchEvent(new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, false, false, PropertyChangeEventKind.UPDATE));
        }

        public var myX : int = 0;
        public var myY : int = 0;
    }
}

testapplication.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="onCreationComplete();">
    <mx:Script>
        <![CDATA[
            import mx.events.PropertyChangeEvent;
            import bindings.BindingObject;
            [Bindable]
            private var something : BindingObject = new BindingObject();

            private function onCreationComplete() : void
            {
                something.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, listener);
                something.beginEdit();
                trace("Begun edit");
                trace("changing myX");
                something.myX = 3;
                trace("changed myX");
                trace("changing myY");
                something.myY = 6;
                trace("changed myY");
                trace("Ending edit");
                something.endEdit();
                trace("Ended");
            }

            private function listener(event : PropertyChangeEvent) : void
            {
                trace("in my listener");
            }

            private function myX(val : int) : String
            {
                trace("in myX");
                return val.toString();
            }

            private function myY(val : int) : String
            {
                trace("in myY");
                return val.toString();
            }
        ]]>
    </mx:Script>
    <mx:Label text="{myX(something.myX)}" />
    <mx:Label text="{myY(something.myY)}" />
</mx:Application>

Итак, как вы можете видеть, я добавил событиепрослушиватель в классе, который должен быть привязан, который будет запущен сразу после сгенерированных слушателей привязки (обратите внимание, приоритет BINDING - 1), и там я прекращаю распространение события.Что означает, что слушатели все еще должны быть выполнены, не будет.Метод endEdit отправит событие PropertyChange, которое вызовет ваш слушатель.

Теперь, при условии, что вы делаете что-то дорогостоящее в своем слушателе, это должно решить вашу проблему.

1 голос
/ 14 февраля 2011

Вы можете использовать класс mx.utils.ObjectProxy и, переопределив его защищенный метод "setupPropertyList" , самостоятельно указать, какие свойства будут вызывать событие PropertyChangeEvent.PROPERTY_CHANGE

1 голос
/ 14 февраля 2011

Вы можете прослушать Event.COMPLETE (или создать собственное событие) и вручную отправить его, когда вы закончите изменять все свои свойства.Например:

myItem.addEventListener(Event.COMPLETE, listener);

protected function listener(e:Event):void
{
   ...
}

затем

myItem.x = newX;
myItem.y = newY;
myItem.dispatchEvent(new Event(Event.COMPLETE));
1 голос
/ 14 февраля 2011

Вы можете переопределить установщик вашего компонента и отправить пользовательское событие

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