我怎样才能在angular 2中使用angular.copy

我怎样才能复制一个对象,并在angular度2中失去它的参考? 与angular1我使用angular.copy(object) ,但我得到一些错误使用angular2。

EXCEPTION:ReferenceError:未定义angular度

假设你正在使用ES6,你可以使用var copy = Object.assign({}, original) 。 适用于现代浏览器; 如果你需要支持旧浏览器检查这个polyfill

更新:

使用TypeScript 2.1+,可以使用ES6速记对象传播表示法:

 const copy = { ...original } 

直到我们有一个更好的解决scheme,您可以使用以下内容:

 duplicateObject = <YourObjType> JSON.parse(JSON.stringify(originalObject)); 

编辑:澄清

请注意:上面的解决scheme只是一个快速修复的单线程,在Angular 2正在积极开发的时候提供。 我的希望是我们可能最终会得到相当于angular.copy() 。 因此,我不想写入或导入一个深度克隆库。

这个方法也有parsingdate属性的问题(它会变成一个string)。

请不要在生产应用程序中使用此方法 。 仅在您的实验项目中使用它 – 您正在学习Angular 2的那些项目。

用bertandg表示使用lodash。 angular度不再有这个方法的原因,因为angular1是一个独立的框架,外部库经常遇到与angular度执行上下文的问题。 Angular 2没有这个问题,所以使用你想要的任何库。

https://lodash.com/docs#cloneDeep

对于拷贝你可以使用Object.assign这是一个ES6function

 let x = { name: 'Marek', age: 20 }; let y = Object.assign({}, x); x === y; //false 

不要用它来进行深度克隆

如果要复制类实例,也可以使用Object.assign,但是需要将新实例作为第一个参数(而不是{})传递:

 class MyClass { public prop1: number; public prop2: number; public summonUnicorn(): void { alert('Unicorn !'); } } let instance = new MyClass(); instance.prop1 = 12; instance.prop2 = 42; let wrongCopy = Object.assign({}, instance); console.log(wrongCopy.prop1); // 12 console.log(wrongCopy.prop2); // 42 wrongCopy.summonUnicorn() // ERROR : undefined is not a function let goodCopy = Object.assign(new MyClass(), instance); console.log(goodCopy.prop1); // 12 console.log(goodCopy.prop2); // 42 goodCopy.summonUnicorn() // It works ! 

正如其他人已经指出,使用lodash或下划线可能是最好的解决scheme。 但是如果你不需要这些库来做任何其他的事情,你可以使用像这样的东西:

  function deepClone(obj) { // return value is input is not an Object or Array. if (typeof(obj) !== 'object' || obj === null) { return obj; } let clone; if(Array.isArray(obj)) { clone = obj.slice(); // unlink Array reference. } else { clone = Object.assign({}, obj); // Unlink Object reference. } let keys = Object.keys(clone); for (let i=0; i<keys.length; i++) { clone[keys[i]] = deepClone(clone[keys[i]]); // recursively unlink reference to nested objects. } return clone; // return unlinked clone. } 

这就是我们决定要做的。