2012-05-08 54 views
0

在Flex(Flash Builder 4)中,我需要一種方法來知道數組集合中的某些內容是否已更改。Flex - 如何檢測對象數據是否改變?

我有一個自定義對象:

[綁定] 公共變種_myobject:爲MyObject;

它基本上只是一個包含一堆不同的字符串和數字屬性的類。

我需要一個可靠的方法來知道是否有任何屬性已被更改。例如,我將屬性綁定到用戶界面(字段),但也可以通過代碼更改某些屬性。

有沒有辦法做到這一點?我發現ChangeWatcher,但看起來它只看到一個簡單的屬性,如String或Number。我需要觀察或檢測對象中所有屬性的更改,希望不必將ChangeWatcher事件添加到每個屬性。這可能嗎?

+0

如果有很多,可以通過代碼更改對象的屬性,你最好當你改變什麼手動踢變化事件。 – Kamal

+0

因此,無論我在代碼中進行了更改,我必須添加事件觸發代碼...如何將所有屬性綁定到字段的屏幕,我必須將onChange事件添加到每個字段,還是沒有更簡單的方法在我的對象中更改屬性時檢測到我的對象已更改? –

+0

well ..有一點小小的解決方法..這將盡可能地減少你的工作量..假設你的對象屬性不是動態的..創建一個對象,手動爲所有屬性編寫setter ..以及任何對setter調用的調用一個常見的函數,它將爲任何屬性發生變化而派發事件......這就是屬性更改監聽器如何在flex中工作(如果m沒有錯,他們在編譯時進行設置),所以即使對象綁定到屏幕上的字段,不需要擔心變化.. – Kamal

回答

1

您可能最好只是在要綁定的特定屬性上分派綁定事件。更好的是,派發一個自定義綁定事件,以便綁定的所有東西不必過濾「這是我關心的屬性嗎?」使用Flash Builder 4.5很容易,只需選擇變量名稱並按下Ctrl-1,選擇「Create getter and setter」,選擇getter和setter,然後選中「Bindable」和「創建自定義事件」。

,看起來像這樣爲你這將創建代碼:

private var _yourProperty:String; 

[Bindable (event='yourPropertyChange')] 
public function get yourProperty():String { 
    return _yourProperty; 
} 

public function set yourProperty(value:String):void { 
    if (value !=== _yourProperty) { 
    _yourProperty = value; 
    dispatchEvent(new Event('yourPropertyChange')); 
    } 
} 

這將大大減少冗長,比Flash Builder生成你,當你只需要使用一種可綁定幕後的代碼更好的性能標籤自己。

0

如果您將定義的類用作VO/DAO並將[Bindable]標籤應用於類,則會爲您綁定所有屬性(只要它們是可讀寫的)。

最好是匿名對象檢測很困難,更不用說增加額外的頭痛來放棄編譯器類型檢查。超級基本示例: - 關鍵是將其綁定到調度程序,因此可以在內部發送PropertyChangeEvent。

[Bindable] 
public class Actor extends EventDispatcher 
{ 
     public var fName:String; 
     public var lName:String; 
     public var age:uint; 

     public function get displayName():String 
     { 
      return lName +', '+ fName; 
     } 

     public function Actor() 
     { 
      super(); 
     } 
} 
+0

這看起來很有希望,爲了確保我遵循,在正在使用的腳本中代碼看起來像什麼,並且希望檢測此對象上的更改?它是addEventListener嗎? –

+0

這取決於最終是什麼使用它:如果它是mxml(在視圖中),只需使用綁定標識符:大括號{}。如果它在AS中,則可以將偵聽器添加到PropertyChangeEvent的「actor」中。如果您想將其細化到更大的粒度,請從類中移除[Bindable],然後將它們放在要觀看的屬性上。你也可以通過使用「事件」標識符來告訴它預期了什麼事件:[Bindable(event =「myfancyevent」)],但你需要自己發送。這裏有更多信息:http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html –

0
public class BindableDictionary extends EventDispatcher { 
     public function BindableDictionary() { 
      super(); 
     } 

     public var dictionary:Dictionary = new Dictionary(); 

     [Bindable("change")] 
     public function get(key:Object):Object { 
      return dictionary[key]; 
     } 

     public function put(key:Object, value:Object):void { 
      dictionary[key] = value; 
      dispatchEvent(new Event(Event.CHANGE)); 
     } 
    } 

也許這班會給你一些新的想法