Actionscript 3 当Flex3中的公共属性发生更改时,如何调用方法?
如果我有一个.mxml文件,其中包含一个方法和一个公共属性,那么我可以在属性更改时执行该方法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
<?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”事件是手动的