如何在Flex 3中更改公共属性时调用方法?

时间:2011-05-12 14:41:06

标签: actionscript-3 flex flex3

如果我的.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 个答案:

答案 0 :(得分:7)

由于还没有人这么说,我会提出第二种方法。

Flex Framework中的每个属性都将调度名为* property * Changed的属性。其中 property 是要更改的属性的名称。如其他人所提到的,使用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 Component LifeCycle相关,例如更改显示或大小,您应该在生命周期方面执行更改;不在你的set方法中。像这样:

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

invalidate方法将强制组件生命周期方法在下一个渲染事件期间重新运行,您可以在相关方法中使用这样的代码:

if(_myPropertyChanged == true){
  _myPropertyChanged = false;
  // do other processing
}

答案 1 :(得分:5)

您可以使用getset访问者方法。更多详情是here

在你的情况下,它类似于:

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

答案 2 :(得分:4)

我就是这样做的。创建一个调用您建议的方法的setter函数:

var _mystatus:Number = 0;

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

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