Как вызвать метод при изменении открытого свойства в Flex 3? - PullRequest
1 голос
/ 12 мая 2011

Если у меня есть файл .mxml, в котором есть метод и открытое свойство, могу ли я выполнить метод при каждом изменении свойства.

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[           
            [Bindable]public var myProperty:MyType;

            private function myMethod(myProperty):void
            {
                // Method to run every time myProperty changes
            }
        ]]>
    </mx:Script>
</mx:HBox>

В другом файле .mxml я добавил этоФайл .mxml выглядит так:

<viewComponents:MyViewComponent myProperty="{myVariable}" />

Ответы [ 3 ]

7 голосов
/ 12 мая 2011

Поскольку никто еще не сказал об этом, я предложу второй подход.

Каждое свойство во Flex Framework будет отправлять свойство с именем типа * свойство * Изменено. где свойство - это имя свойства, которое нужно изменить. Указанные свойства реализованы с использованием методов get set, как уже упоминали другие. Как то так:

private var _myProperty:MyType;

[Bindable(myPropertyChanged)]
public function get myProperty():MyType
{
    return _myProperty;
}
public function set myProperty(value:MyType):void
{
    _myProperty = value;
   dispatchEvent(new Event('myPropertyChanged'));
}

Эти имена событий, указанные в метаданных Bindable, используются для целей привязки. Таким образом, вместо вызова вашего метода внутри набора, вы можете прослушивать событие myPropertyChanged:

component.addEventListener('myPropertyChanged',onMyPropertyChanged)

И в других местах кода:

protected function onMyPropertyChanged(event:Event):void{
 // do other processing
}

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

Если ваша новая функциональность каким-либо образом связана с жизненным циклом компонента Flex, например при изменении дисплея или размера, вы должны вносить изменения в методы жизненного цикла; не в вашем установленном методе. Примерно так:

private var _myProperty:MyType;
private var _myPropertyChanged:Boolean = false
[Bindable('myPropertyChanged')]
public function get myProperty():MyType
{
    return _myProperty;
}
public function set myProperty(value:MyType):void
{
    _myProperty = value;
   _myPropertyChanged = true;
   invalidateProperties();
   invalidateDisplayList();
   invalidateSize()
   invalidateSkinState(); // spark comps only
   dispatchEvent(new Event('myPropertyChanged'));
}

Недействительные методы заставят метод жизненного цикла компонента перезапускаться во время следующего события рендеринга, и вы можете использовать подобный код в соответствующем методе:

if(_myPropertyChanged == true){
  _myPropertyChanged = false;
  // do other processing
}
5 голосов
/ 12 мая 2011

Вы можете использовать методы доступа get и set. Более подробная информация здесь .

В вашем случае это что-то вроде:

private var _myProperty:MyType;

public function set myProperty(value:MyType):void
{
    _myProperty = value;
    // he best way is to place myMethod body here
    myMethod(_myProperty);
}

[Bindable]
public function get myProperty():MyType
{
    return _myProperty;
}
4 голосов
/ 12 мая 2011

Вот как бы я это сделал. Создайте функцию установки, которая вызывает предложенный вами метод:

var _mystatus:Number = 0;

function set mystatus(val:Number):void
{
_mystatus = val;
alertfunction();
}

function get mystatus():Number
{
return _mystatus;
}
...