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

Dav*_*veC 1 apache-flex flex3 actionscript-3

如果我有一个.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>
Run Code Online (Sandbox Code Playgroud)

在另一个.mxml文件中,我添加了这个.mxml文件,如下所示:

<viewComponents:MyViewComponent myProperty="{myVariable}" />
Run Code Online (Sandbox Code Playgroud)

Jef*_*ser 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'));
}
Run Code Online (Sandbox Code Playgroud)

Bindable元数据中指定的这些事件名称用于绑定目的.因此,您可以监听此myPropertyChanged事件,而不是在集合中调用您的方法:

component.addEventListener('myPropertyChanged',onMyPropertyChanged)
Run Code Online (Sandbox Code Playgroud)

以及代码中的其他地方:

protected function onMyPropertyChanged(event:Event):void{
 // do other processing
}
Run Code Online (Sandbox Code Playgroud)

对于你想要完成的事情,这可能是过度的; 或不.既然你没有详细说明你想要完成的事情,我不确定.

如果您的新功能以某种方式与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'));
}
Run Code Online (Sandbox Code Playgroud)

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

if(_myPropertyChanged == true){
  _myPropertyChanged = false;
  // do other processing
}
Run Code Online (Sandbox Code Playgroud)


Con*_*ner 5

您可以使用getset访问方法.更多细节在这里.

在你的情况下它是这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)