javascript - 克隆可观察对象的最佳方法?

标签 javascript knockout.js

在 Knockout 中克隆 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 函数的函数。它使用 source 对象的所有 observable(或不可观察的)属性值填充 target 对象。

// 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 副本并构建一个新的对象。这确保所有内存指针都不会被复制,并且您拥有一个与原始对象匹配的全新对象。这里的一个关键是你必须传入一个新对象的空实例(否则我们不知道要填充什么属性)

// then finally the clone function
ko.utils.clone = function(obj, emptyObj){
    var json = ko.toJSON(obj);
    var js = JSON.parse(json);

    return ko.utils.extendObservable(emptyObj, js);
};

然后你可以像这样使用它:

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

关于javascript - 克隆可观察对象的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10535548/

相关文章:

JavaScript:如何检查浏览器是否存储了图像或任何 Assets ,而不是从互联网下载

javascript - mocha.opts 已弃用,如何迁移到 package.json?

javascript - knockout 绑定(bind)处理程序未定义错误

javascript - Browserify Babel ES2015 Knockout 相互依赖模块

javascript - knockoutJS动态改变foreach绑定(bind)

javascript - 为什么要使用 $sce.trustAsResourceUrl(iframeUrl)?

javascript - 我有多少个具有特定标签名称的元素

javascript - MQTT.js - 如何处理连接错误?

javascript - 从knockoutjs到 View 页面的数据绑定(bind)信息 - 信息未显示

javascript - 如何在JSON中使用Knockoutjs的数据绑定(bind)功能?