【问题标题】:Flex - how to detect if Object DATA has changed?Flex - 如何检测对象数据是否已更改?
【发布时间】:2012-05-08 19:48:00
【问题描述】:

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

我有一个自定义对象:

[可绑定] public var _myobject:MyObject;

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

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

有没有办法做到这一点?我找到了 ChangeWatcher,但看起来它只查看一个简单的属性,例如字符串或数字。我需要观察或检测对象中所有属性的变化,希望不必将 ChangeWatcher 事件添加到每个属性。这可能吗?

【问题讨论】:

  • 如果有很多对象的属性可以通过代码进行更改,那么您最好在更改任何内容时手动启动更改事件。
  • 因此,无论我在哪里更改代码,我都必须添加事件触发代码...如果屏幕的所有属性都绑定到字段,我是否必须向每个字段添加 onChange 事件,或者当我的对象中的属性发生更改时,是否有更简单的方法来检测我的对象已更改?
  • 好吧.. 有一个小解决方法.. 这将至少在一定程度上减少您的工作量.. 假设您的对象属性不是动态的.. 创建一个为所有属性手动编写设置器的对象。 . 并且任何对 setter 的调用都会调用一个通用函数,该函数将为任何更改的属性调度一个事件.. 这就是属性更改侦听器在 flex 中的工作方式。(如果 m 没有错,它们会在编译时进行设置)所以即使对象是绑定到屏幕上的字段,您无需担心更改..

标签: apache-flex events object flash-builder


【解决方案1】:

您最好只在您希望可绑定的特定属性上调度绑定事件。更好的是,调度一个自定义绑定事件,这样所有绑定的东西都不必过滤“这是我关心的属性吗?”使用 Flash Builder 4.5 执行此操作非常简单,只需选择变量名称并按 Ctrl-1,选择“创建 getter 和 setter”,选择 getter 和 setter 并选中“可绑定”和“创建自定义事件”。

这将为您创建如下所示的代码:

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

与您单独使用 Bindable 标记时 Flash Builder 在幕后为您生成的代码相比,这将更少冗长且性能更高。

【讨论】:

    【解决方案2】:

    如果您将定义的类用作 VO/DAO 并将 [Bindable] 标记应用于该类,这将为您绑定所有属性(只要它们是读/写的)。

    匿名对象检测充其量是困难的,更不用说增加失去编译器类型检查的额外麻烦了。

    超级基本的例子:-关键是把它绑定到dispatcher,这样它就可以在内部发出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();
          }
     }
    

    【讨论】:

    • 这看起来很有希望,只是为了确保我遵循,正在使用并想要检测此对象更改的脚本中的代码会是什么样子?是 addEventListener 吗?
    • 这最终取决于它的用途:如果它是 mxml(在视图中),只需使用绑定标识符:大括号 {}。如果它在 AS 中,您可以为 PropertyChangeEvent 添加一个侦听器到“actor”。如果您想将其细化到更大的粒度,请从类中删除 [Bindable],并将它们放在您要查看的属性上。您还可以通过使用“事件”标识符来告诉它期望什么事件: [Bindable(event="myfancyevent")] 但您需要自己调度它。更多信息在这里:livedocs.adobe.com/flex/3/html/…
    【解决方案3】:
    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));
            }
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      相关资源
      最近更新 更多