0

「キャンセル」ボタン機能を実装するための最良の方法は何ですか(たとえば、いくつかの共有モデルと双方向バインディングを使用するダイアログの場合)?

オブジェクト内のすべてのフィールドを「元に戻す」オブジェクトにコピーするという明白な解決策は、目的を無効にします(保存時に各値を手動で設定するだけでもかまいません)。過去にObjectUtil.copy/cloneを使用したことがありますが、リストなどを含むより複雑なデータ型に関するすべての警告を認識していません(ディープコピーとシャローコピー)

より良い/他の方法はありますか?

4

2 に答える 2

1

AS3をお読みください-オブジェクトのクローンを作成します

複雑な値オブジェクトの場合、クローンの作成にByteArrayクラスを使用するとよいでしょう。ただし、複製するすべてのクラスに[RemoteClass]またはregisterClassAliasを使用していることを確認してください。

于 2012-09-21T16:41:58.657 に答える
1

ビルトインObjectUtil.clone()ObjectUtil.copy()メソッドに問題がありました。そのため、ByteArrayを使用する代わりにイントロスペクションを使用する独自のバージョンを作成しました。

1つのメソッドは、すべてのプロパティを1つのインスタンスから別のインスタンスにコピーします。

    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];
    }

もう1つは、オブジェクトのすべてのプロパティを新しいインスタンスにコピーすることにより、オブジェクトの完全なクローンを作成します。

    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 に答える