2009-10-12 124 views
2

在AIR應用程序中,我有一個私有變量和setter方法:Flex事件纔會觸發一次

private var _saveResult 
public function set saveResult(result:String):void 
{ 
    _saveResult = result; 
    dispatchEvent(new resultUpdatedEvent(_saveResult)); 
} 

的第一次,我設置「saveResult」的事件觸發。但除非我重新啓動應用程序,否則它不會再次啓動。

如果我改變二傳手到:

public function set saveResult(result:String):void 
{ 
    _saveResult = result; 
    if (result != null) 
    { 
     dispatchEvent(new resultUpdatedEvent(_saveResult)); 
    } 
} 

問題就沒有了,我可以設置每次變量很多時間和事件觸發。

我的問題:

我在這裏做錯了什麼?如果沒有,任何人都可以向我解釋發生了什麼?如果是這樣,我該怎麼做?

謝謝!

回答

1

每評論... 有沒有事件調度問題。 我誤診了這個問題,真正的問題是,如果你有一個[Bindable]屬性,並且你使用了一個setter,並且將它設置爲當前值,那麼flex將忽略它。所以你有幾個選擇:

1)給getter和setter不同的名字。看起來像一個「壞主意」,但它確實解決了這個問題。

2)從類(我的問題)或屬性中刪除[Bindable]。如果該類未實現IEventDispatcher,則需要這樣做。你可以簡單地「擴展Sprite」來看它是否工作,但這看起來像是一個「壞主意」作爲解決方案,所以我在本頁末尾實現了IEventDispatcher:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/events/IEventDispatcher.html

3)我確定有一種方法可以解決這個錯誤,但我實際上並不需要這個類是[Bindable],所以我沒有找到解決方法。

3

看起來你錯誤地構造了你的事件。 Event對象的第一個參數應該始終是一個字符串。所以在這種情況下,你會想要始終使用相同的字符串,以便可以聽取事件。你的resultUpdatedEvent類是什麼樣的?你會希望它看起來是這樣的:

package myEvents 
{ 
    import flash.events.Event; 

    public class PropertyChangeEvent extends Event 
    { 
     public static const PROPERTY_CHANGE:String = "propertyChange"; 

     public var result:String = ""; 

     // Public constructor. 
     public function PropertyChangeEvent (type:String, 
      result:String="") { 
       // Call the constructor of the superclass. 
       super(type); 

       // Set the new property. 
       this.result= result; 
     } 


     // Override the inherited clone() method. 
     override public function clone():Event { 
      return new PropertyChangeEvent(type, result); 
     } 
    } 
} 

這樣一來,當你去你的派遣活動,您可以構造事件如下:

new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, result); 

這樣一來,你就監聽事件「PropertyChangeEvent.PROPERTY_CHANGE」,該事件從不改變。現在的問題是,你的事件監聽器可能正在監聽結果中保存的字符串所表示的事件,顯然,它在第一次設置後會發生變化,因此無法爲其分配監聽器。

更多有關事件在AS3是如何工作的:http://livedocs.adobe.com/flex/3/html/help.html?content=events_02.html

+0

@quoo 哇。好決定!我正在構建我的活動不正確,謝謝你的提示。 :D 但現在我正確調用構造函數,仍然有問題。 我找到了。 如果我有一個getter和一個具有相同名稱的setter函數(saveResult),那麼我可以調用setter一次,任何後續調用只是默默無聞。事實證明,這不是一個事件錯誤,但我學到了關於事件的東西,所以謝謝。我必須在我的二傳手/吸氣球手上做錯事,但我看不到任何問題。 – PaulC 2009-10-12 19:52:01

+1

你確定你正在設置不同的值。如果您設置了相同的值,Flex會忽略它(以節省綁定時間)。 – ZaBlanc 2009-10-13 04:42:25

+0

@ZaBlanc只有當屬性是[[Bindable]]時,對吧? – Amarghosh 2009-10-13 05:28:12