【问题标题】:JavaScript clone object with KnockoutJS observable properties具有 KnockoutJS 可观察属性的 JavaScript 克隆对象
【发布时间】:2012-12-12 21:05:31
【问题描述】:

我有一个混合了 KnockoutJS 可观察对象和标准属性的对象:

var original = {
  a: ko.observable("a"),
  b: "b"
};

我想创建一个original 对象的克隆而不对其进行任何引用,这样我就可以这样做:

var cloned = clone(original);
cloned.a("a cloned");
original.a(); //-> "a" ERROR HERE

original.a("a original");
cloned.a(); //-> "a cloned" ERROR HERE

cloned.b = "b cloned";
original.b //-> "b" OK

original.b = "b original";
cloned.b //-> "b cloned" OK

我已尝试使用该功能,但它导致 KnockoutJS 可观察属性被复制,而不是克隆:

cloneObj = function(obj){
  if(obj === null || typeof obj !== 'object')
    return obj;

  var temp = obj.constructor(); // Give temp the original obj's constructor
  for (var key in obj) {
    temp[key] = cloneObj(obj[key]);
  }

  return temp;
};

正如你在这个小提琴http://jsfiddle.net/Ep3jY/ 中看到的,这个问题只发生在 KnockoutJS Observable 属性上,而正常的 JavaScript 属性被正确克隆。

现在我使用一种变通方法返回带有函数的对象,但这很烦人:

function(){
  return {
    a: ko.observable("a");
  };
}

【问题讨论】:

标签: javascript object knockout.js clone cloning


【解决方案1】:

好的,问题似乎出在 KnockoutJS observables 上。我是这样解决的:

cloneObj = function(obj){
  if(ko.isWriteableObservable(obj)) 
      return ko.observable(obj()); // This is the trick
  if(obj === null || typeof obj !== 'object') 
      return obj;

  var temp = obj.constructor(); // Give temp the original obj's constructor
  for (var key in obj) {
    temp[key] = cloneObj(obj[key]);
  }

  return temp;
};

【讨论】:

  • 对我不起作用。它将引用对象返回给源对象。因此,如果您更改输出对象中的某些值,它会影响传递的值。
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2012-04-20
  • 2015-02-08
  • 2018-12-26
  • 2017-11-25
相关资源
最近更新 更多