实现“取消”按钮功能的最佳方式是什么(比如对于使用一些共享模型和双向绑定的对话框)?
将对象中的每个字段复制到“还原” obj 中的明显解决方案违背了目的(可能只是在保存时手动设置每个值)。我过去使用过 ObjectUtil.copy/clone,但我不知道包含列表等的更复杂数据类型的所有注意事项。(深拷贝与浅拷贝)
有没有更好的/其他方法?
实现“取消”按钮功能的最佳方式是什么(比如对于使用一些共享模型和双向绑定的对话框)?
将对象中的每个字段复制到“还原” obj 中的明显解决方案违背了目的(可能只是在保存时手动设置每个值)。我过去使用过 ObjectUtil.copy/clone,但我不知道包含列表等的更复杂数据类型的所有注意事项。(深拷贝与浅拷贝)
有没有更好的/其他方法?
我遇到了内置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;
}
请阅读AS3 - 克隆对象
对于复杂的值对象,最好使用 ByteArray 类进行创建克隆。但请确保您为要克隆的所有类使用 [RemoteClass] 或 registerClassAlias。