Flex - 如何检测Object DATA是否已更改?

时间:2012-05-08 19:48:01

标签: flex events object flash-builder

在Flex(Flash Builder 4)中,我需要一种方法来了解数组集合中的某些内容是否已更改。

我有一个自定义对象:

[绑定] public var _myobject:MyObject;

它基本上只是一个包含许多不同String和Number属性的类。

我需要一种可靠的方法来了解是否有任何属性已被更改。例如,我将属性绑定到用户界面(字段),但也可以通过代码更改某些属性。

有办法做到这一点吗?我找到了ChangeWatcher,但看起来它只查看一个简单的属性,例如String或Number。我需要观察或检测对象中所有属性的更改,希望无需将ChangeWatcher事件添加到每个属性。这可能吗?

3 个答案:

答案 0 :(得分:1)

您可能最好只在您想要绑定的特定属性上调度绑定事件。更好的是,调度一个自定义绑定事件,以便所有绑定的东西不必过滤“这是我关心的属性吗?”使用Flash Builder 4.5非常简单,只需选择变量名并按Ctrl-1,选择“创建getter和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在您自己使用Bindable标记时为您生成的代码更简洁,更高效。

答案 1 :(得分: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();
      }
 }

答案 2 :(得分: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));
        }
    }

也许这门课会给你一些新的想法