2008-10-16 53 views
2

我在Actionscript中有一個CircleButton類。 我想知道什麼時候有人在外面更改了「開」屬性。 我嘗試聆聽'onChange',但它從未擊中該事件處理程序。Actionscript組件可以監聽它自己的propertyChange事件嗎?

我知道我可以寫「上」屬性爲獲取/ setter方法,但我喜歡只用[綁定]

一個對象可以不聽自己的事件的簡單?

public class CircleButton extends UIComponent 

{ 
    [Bindable] 
    public var on:Boolean; 

    public function CircleButton() 
    { 
     this.width = 20; 
     this.height = 20; 

     graphics.beginFill(0xff6600, 1); 
     graphics.drawCircle(width/2, height/2, width/2); 
     graphics.endFill(); 

     this.addEventListener(MouseEvent.ROLL_OVER, rollover); 
     this.addEventListener(MouseEvent.ROLL_OUT, rollout);   

     this.addEventListener('onChange', onOnChange); 
    }  

    private function onOnChange(event:PropertyChangeEvent):void { 

回答

7

如果在未指定事件類型的情況下使用[Bindable]標籤,那麼當屬性更改其值時,將調度屬性爲PropertyChangeEvent.PROPERTY_CHANGE的字符串'propertyChange'。

因此,爲了能夠註冊聽這種情況下,你需要說:

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange); 

之所以偵聽器函數是從來沒有所謂的是,事件類型是不正確的。

請注意,當您的類中標記爲Bindable的任何變量發生更改時,將不會調用偵聽器方法,而不僅僅是'on'。該事件附帶一個名爲「屬性」的屬性,用於指示哪個變量已更改。

爲了避免被調用每個可綁定變量,你需要指定在[綁定]標籤的事件:手動

[Bindable(event="myOnChangeEvent")] 

並分派該事件當你考慮到該屬性正在發生變化(即:在二傳手),儘管這似乎並不是你想要做的。

+0

您不需要在方法調用前使用`this`引用。 – 2010-09-22 18:43:18

1

你可以使用BindingUtils.bindSetter()

一個例子是發現here

1

僅僅因爲有可能將某些東西綁定到變量上,並不意味着某些東西被綁定到變量上。這有點像事件系統 - 僅僅因爲某件事可以派發事件並不意味着任何事情都在傾聽。

Flex綁定所基於的類是BindingUtils和ChangeWatcher。當你在MXML中直接綁定(它只是被編譯器轉換爲AS3)時,它會在場景後面使用這些類來真正建立綁定。我已經在ChangeWatcher中挖掘過,當它查看可能綁定項目的列表時,它只在某個對象實際列爲偵聽器時才分派。整個綁定系統實際上是事件系統的智能包裝。

AS3中的綁定的語義而不是MXML是不同的。在MXML中工作的微妙差異(如鏈接到對象的子屬性)需要AS3中的工作來複制行爲(可能是MXML到AS3之間代碼生成的結果)。

查看此Adobe doc瞭解AS代碼中ChangeWatcher的一些信息。

個人 - 我不使用MXML以外的綁定,因爲我覺得它很笨拙。我建議你寫一個setter函數,因爲它更具可預測性(並且很可能是高性能的)。我還建議您閱讀ChangeWatcher和BindingUtils的源代碼。這絕對是您可能閱讀的最先進的AS3中的一些。

1

我最喜歡的方法之一是觀察類,它被發現here。它本質上是使用setter,但它是一個很好的可重複的方法。