取消Flex双向绑定更改

时间:2012-09-21 16:06:46

标签: flex data-binding binding flex4

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

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

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

2 个答案:

答案 0 :(得分:1)

请阅读AS3 - Clone an object

对于复杂的值,使用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;
    }