克隆中可观察对象的最佳方式是什么,以形成一种交易机制?
例如编辑此模型:
例如编辑此模型:
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; };
然后我有一个复制功能,它将基本上将要复制的对象转换成JSON,然后获取JSON副本并构建一个新的JavaScript对象.这样可以确保所有的内存指针都不被复制,并且您有一个全新的对象与您的原始对象相匹配.这里的一个关键是你必须传递一个新对象的空实例(否则我们不知道要填充什么属性)
// 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());