2011-05-12 57 views
1

如果我有一個其中有一種方法和公共財產一個的.mxml文件,我可以有方法執行每當屬性發生變化。如何調用一個方法時,Flex 3中的公共屬性的變化?

<?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}" /> 

回答

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

希望你不要介意我的編輯:)雖然很好的答案! – blong 2011-05-12 15:18:00

+0

@Brian L我投票拒絕編輯。使整個類可以綁定會起作用,但在許多情況下,我認爲這是一種不好的做法。任何給定類別的許多屬性很可能不需要被製作爲可綁定;那爲什麼要在代碼中添加它們呢? – JeffryHouser 2011-05-12 15:28:23

+0

@ www.Flextras.com這是可以理解的,我想你是對的。它確實是有道理的,_best practice_將只標記需要的字段'[Bindable]'。雖然,我確實想向提問者(@DaveC)指出綁定整個班級的選項。 – blong 2011-05-12 15:36:59

4

這是我會怎麼做。創建調用您提出方法的setter函數:

var _mystatus:Number = 0; 

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

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

既然沒有人說這個呢,我就提出了第二種方法。

在Flex框架每個屬性將派遣一個屬性名字類似*財產*改變。其中財產要更改的屬性的名稱。所述屬性使用其他人已經提到的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組件的生命週期以某種方式,如改變顯示或你應該執行生命週期中的編制方法的更改的大小;不在你設定的方法中。事情是這樣的:

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

的無效方法將強制組件的生命週期方法的下一個渲染事件中重新運行,你可以在相關的方法使用這樣的代碼:

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

+1,提供一個深入的,事件驅動的解決方案。 – Kyle 2011-05-12 15:53:08

+0

不應該將'[Bindable]'rag的事件名稱放在引號中,如下所示:[[Bindable(「myPropertyChanged」)]'? – Constantiner 2011-05-12 16:29:07

+0

並告訴真實的你不需要在你的情況下手動調度事件。離開'[Bindable]'標籤不帶參數會自動產生''propertyChange''事件(通過'mxmlc'編譯器)。但無論如何,有很多情況下手動事件調度可能非常有用。當然,手動派發事件的類應該從'EventDispatcher'繼承或實現'IEventDispatcher'。 – Constantiner 2011-05-12 16:33:43

相關問題