Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 克隆可观测对象的最佳方法?_Javascript_Knockout.js - Fatal编程技术网

Javascript 克隆可观测对象的最佳方法?

Javascript 克隆可观测对象的最佳方法?,javascript,knockout.js,Javascript,Knockout.js,克隆敲除中的可观察对象以形成某种交易机制的最佳方法是什么? 例如,编辑此模型: var Action = function (name, ownerType, condition, expression, args) { var self = this; this.name = ko.observable(name); this.ownerType = ko.observable(ownerType); this.condition = ko.observable

克隆敲除中的可观察对象以形成某种交易机制的最佳方法是什么?

例如,编辑此模型:

var Action = function (name, ownerType, condition, expression, args) {
    var self = this;
    this.name = ko.observable(name);
    this.ownerType = ko.observable(ownerType);
    this.condition = ko.observable(condition);
    this.expression = ko.observable(expression);
    this.args = ko.observable(args);
};
我想在用户编辑之前保存该对象的状态。如果用户将取消编辑-回滚对象状态。

最简单的方法是创建另一个项目,如:

self.tempAction = new Action(action.name(), action.ownerType(), action.condition(), action.expression(), action.args());
但我不确定这是不是一个优雅的解决方案


那么,有什么想法吗?

我通常会做如下事情:

首先,我有一个模仿jQuery的
$.extend
函数的函数。它用
对象的所有
可观察
(或不可观察)属性值填充
目标
对象

// extends observable objects intelligently
ko.utils.extendObservable = function ( target, source ) {
    var prop, srcVal, isObservable = false;

    for ( prop in source ) {

        if ( !source.hasOwnProperty( prop ) ) {
            continue;
        }

        if ( ko.isWriteableObservable( source[prop] ) ) {
            isObservable = true;
            srcVal = source[prop]();
        } else if ( typeof ( source[prop] ) !== 'function' ) {
            srcVal = source[prop];
        }

        if ( ko.isWriteableObservable( target[prop] ) ) {
            target[prop]( srcVal );
        } else if ( target[prop] === null || target[prop] === undefined ) {

            target[prop] = isObservable ? ko.observable( srcVal ) : srcVal;

        } else if ( typeof ( target[prop] ) !== 'function' ) {
            target[prop] = srcVal;
        }

        isObservable = false;
    }
    return target;
};
然后我有一个
copy
函数,它基本上将要复制的对象转换为
JSON
,然后获取
JSON
副本并构建一个新的javascript对象。这样可以确保所有内存指针都不会被复制,并且您拥有一个与原始对象匹配的全新对象。这里的一个关键是您必须传入一个新对象的空实例(否则我们将不知道要填充什么属性)

然后您可以这样使用它:

var tempAction = ko.utils.clone(action, new Action());

你能不能不使用ko.mapping插件将原始源对象映射到新的目标对象?@jaffa-是的,映射插件将是一个合适的选项。然而,对于琐碎的需求来说,这可能是过分的。另外,我发现
extendObservable
函数在应用程序范围内不需要映射插件的情况下非常有用?我认为使用toJSON和JSON.parse复制一个对象会丢失它所有的计算值。@ericb+1可以工作,但似乎有些过分,我有类似于您的extendObservable的方法,出于某种原因,我无法通过传递空实例并复制原始对象而不首先将原始实例序列化为JSON来让它工作,你知道为什么,我的意思是,什么样的引用会粘在一起,因为你正在展开可观察的以获得纯值…?在深度克隆中可能有一些问题,我指的是嵌套的视图模型。
var tempAction = ko.utils.clone(action, new Action());