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)
既然没有人这么说,我会提出第二种方法.
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)
您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)