实现“取消”按钮功能的最佳方式是什么(例如,对于使用某些共享模型和双向绑定的对话框)?
将对象中的每个字段复制到“恢复”对象中的明显解决方案违背了目的(也可以在保存时手动设置每个值)。我以前使用过ObjectUtil.copy / clone,但是我不知道包含列表等更复杂数据类型的所有注意事项(深层与浅层复制)
有没有更好的/其他方法?
答案 0 :(得分:1)
对于复杂的值,使用ByteArray类进行创建克隆会很好。 但请确保您使用[RemoteClass]或registerClassAlias来处理要克隆的所有类。
答案 1 :(得分:1)
我遇到了内置ObjectUtil.clone()
和ObjectUtil.copy()
方法的问题。这就是为什么我创建自己的版本使用内省而不是使用ByteArray。
一种方法将所有属性从一个实例复制到另一个实例:
private static const rw:String = "readwrite";
public static function copyProperties(source:Object, target:Object):void {
if (!source || !target) return;
//copy properties declared in Class definition
var sourceInfo:XML = describeType(source);
var propertyLists:Array = [sourceInfo.variable, sourceInfo.accessor];
for each (var propertyList:XMLList in propertyLists) {
for each (var property:XML in propertyList) {
if (property.@access == undefined || property.@access == rw) {
var name:String = property.@name;
if (target.hasOwnProperty(name)) target[name] = source[name];
}
}
}
//copy dynamic properties
for (name in source)
if (target.hasOwnProperty(name))
target[name] = source[name];
}
另一个通过将其所有属性复制到新实例来创建对象的完整克隆:
public static function clone(source:Object):* {
var Clone:Class = getDefinitionByName(getQualifiedClassName(source)) as Class;
var clone:* = new Clone();
copyProperties(source, clone);
return clone;
}