Ответ 1
Я обычно делаю что-то вроде следующего:
Сначала у меня есть функция, которая имитирует функцию 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());