0

实现“取消”按钮功能的最佳方式是什么(比如对于使用一些共享模型和双向绑定的对话框)?

将对象中的每个字段复制到“还原” obj 中的明显解决方案违背了目的(可能只是在保存时手动设置每个值)。我过去使用过 ObjectUtil.copy/clone,但我不知道包含列表等的更复杂数据类型的所有注意事项。(深拷贝与浅拷贝)

有没有更好的/其他方法?

4

2 回答 2

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;
    }
于 2012-09-21T21:39:38.340 回答
1

请阅读AS3 - 克隆对象

对于复杂的值对象,最好使用 ByteArray 类进行创建克隆。但请确保您为要克隆的所有类使用 [RemoteClass] 或 registerClassAlias。

于 2012-09-21T16:41:58.657 回答