我通常会执行以下操作:
首先,我有一个模仿 jQuery 函数的$.extend
函数。target
它使用对象的所有observable
(或不可观察的)属性值填充source
对象。
// 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 对象。这样可以确保所有内存指针都不会被复制,并且您拥有一个与原始对象匹配的全新对象。这里的一个关键是您必须传入一个新对象的空实例(否则我们将不知道要填充哪些属性)
// 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());