Actionscript 3 当Flex3中的公共属性发生更改时,如何调用方法?

Actionscript 3 当Flex3中的公共属性发生更改时,如何调用方法?,actionscript-3,apache-flex,flex3,Actionscript 3,Apache 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:My

如果我有一个.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}" />

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

var _mystatus:Number = 0;

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

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

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

var _mystatus:Number = 0;

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

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

您可以使用
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;
}

您可以使用
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;
}

既然还没有人这么说,我将提出第二种方法

Flex框架中的每个属性都将分派一个名为*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'));
}
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'));
}
可绑定元数据中指定的这些事件名称用于绑定目的。因此,您可以侦听myPropertyChanged事件,而不是在集合中调用您的方法:

component.addEventListener('myPropertyChanged',onMyPropertyChanged)
以及守则的其他部分:

protected function onMyPropertyChanged(event:Event):void{
 // do other processing
}
这对于你想要完成的事情来说可能是过分的;或者不是。因为你没有详细说明你想要完成什么,我不确定

如果您的新功能以某种方式与Flex组件生命周期相关,例如更改显示或尺寸,您应该在生命周期方法中执行更改;不在你的设定方法中。大概是这样的:

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

既然还没有人这么说,我将提出第二种方法

Flex框架中的每个属性都将分派一个名为*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'));
}
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'));
}
可绑定元数据中指定的这些事件名称用于绑定目的。因此,您可以侦听myPropertyChanged事件,而不是在集合中调用您的方法:

component.addEventListener('myPropertyChanged',onMyPropertyChanged)
以及守则的其他部分:

protected function onMyPropertyChanged(event:Event):void{
 // do other processing
}
这对于你想要完成的事情来说可能是过分的;或者不是。因为你没有详细说明你想要完成什么,我不确定

如果您的新功能以某种方式与Flex组件生命周期相关,例如更改显示或尺寸,您应该在生命周期方法中执行更改;不在你的设定方法中。大概是这样的:

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

@Brian L我投票否决了编辑。使完整的类绑定可以工作,但我会认为这是一个糟糕的做法在许多情况下。任何给定类上的许多属性很可能不需要绑定;那么,为什么要添加代码使其如此呢?@www.Flextras.com这是可以理解的,我想你是对的。最好的做法是只标记所需的字段,这是有道理的。不过,我确实想向询问者(@DaveC)指出绑定整个类的选项。@Brian L我投票拒绝了编辑。使完整的类绑定可以工作,但我会认为这是一个糟糕的做法在许多情况下。任何给定类上的许多属性很可能不需要绑定;那么,为什么要添加代码使其如此呢?@www.Flextras.com这是可以理解的,我想你是对的。最好的做法是只标记所需的字段,这是有道理的。尽管如此,我还是想向询问者(@DaveC)指出绑定整个类的选项。您不应该用下面的方式将
[Bindable]
rag的事件名称引到引号中
[Bindable(“myPropertyChanged”)]
?并且告诉真实情况,您不需要在您的案例中手动调度事件。将
[Bindable]
标记单独保留而不带参数将自动生成
“propertyChange”
事件(通过
mxmlc
编译器)。但无论如何,在很多情况下,手动事件调度非常有用。当然,手动分派事件的类应该从
EventDispatcher
继承,或者在Flex框架内实现
IEventDispatcher
@constantiner,'propertyChange'事件是手动分派的;所以我一直在我自己的代码中这样做。我不确定MXML组件是否与仅作为组件的组件做不同的事情。但是,分派事件是正确的,类必须扩展EventDispatcher或实现IEventDispatcher。所有Flex UI组件都会这样做。
mxmlc
始终为带有
[Bindable]
声明的ActionScript类生成一些代码,即使它们不是从
EventDispatcher
继承的。您可以使用
-keep generated actionscript=true
查看它。您不应该用以下方式将
[Bindable]
rag的事件名称引到引号中
[Bindable(“myPropertyChanged”)]
?并且告诉true您不需要在您的案例中手动分派事件。将
[Bindable]
标记单独保留而不带参数将自动生成
“propertyChange”
事件(通过
mxmlc
编译器)。但无论如何,在很多情况下,手动事件调度非常有用。当然,手动分派事件的类应该从
EventDispatcher
继承,或者在Flex框架内实现
IEventDispatcher
@constantiner“propertyChange”事件是手动的