Dmi*_*ets 11 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);
};
Run Code Online (Sandbox Code Playgroud)
我想在用户编辑之前保存该对象的状态.如果用户将取消编辑 - 回滚对象状态.
最简单的方法就是创建另一个项目,如:
self.tempAction = new Action(action.name(), action.ownerType(), action.condition(), action.expression(), action.args());
Run Code Online (Sandbox Code Playgroud)
但我不确定这是优雅的解决方案..
那么,有什么想法吗?
eri*_*icb 15
我通常会做以下事情:
首先,我有一个模仿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;
};
Run Code Online (Sandbox Code Playgroud)
然后我有一个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);
};
Run Code Online (Sandbox Code Playgroud)
然后您可以像这样使用它:
var tempAction = ko.utils.clone(action, new Action());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9719 次 |
| 最近记录: |