Cuál es la alternativa a angular.copy en Angular

¿Cómo puedo copiar un objeto y perder su referencia en Angular?

Con AngularJS, puedo usar angular.copy(object) , pero angular.copy(object) algún error al usar eso en Angular.

EXCEPCIÓN: ReferenceError: angular no está definido

Suponiendo que está utilizando ES6, puede usar var copy = Object.assign({}, original) . Funciona en navegadores modernos; si necesita admitir navegadores más antiguos, consulte este polyfill

actualizar:

Con TypeScript 2.1+, la notación abreviada de dispersión de objetos de ES6 está disponible:

 const copy = { ...original } 

Hasta que tengamos una mejor solución, puede usar lo siguiente:

 duplicateObject =  JSON.parse(JSON.stringify(originalObject)); 

EDITAR: Aclaración

Tenga en cuenta que la solución anterior solo pretendía ser un trazador de líneas de solución rápida, en un momento en que Angular 2 estaba en desarrollo activo. Mi esperanza era que eventualmente pudiéramos obtener un equivalente de angular.copy() . Por lo tanto, no quería escribir ni importar una biblioteca de clonación profunda.

Este método también tiene problemas con las propiedades de fecha de análisis (se convertirá en una cadena).

No use este método en aplicaciones de producción . Úselo solo en sus proyectos experimentales, los que está haciendo para aprender Angular 2.

Use lodash como se indica en la figura. El motivo por el cual angular ya no tiene este método es porque angular 1 era un marco autónomo, y las bibliotecas externas a menudo tenían problemas con el contexto de ejecución angular. Angular 2 no tiene ese problema, por lo tanto, use la biblioteca que desee.

https://lodash.com/docs#cloneDeep

Para realizar copias poco profundas , puede usar Object.assign, que es una función de ES6

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

NO lo use para la clonación profunda

Si desea copiar una instancia de clase, también puede usar Object.assign, pero debe pasar una nueva instancia como primer parámetro (en lugar de {}):

 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 ! 

La alternativa para copiar profundamente objetos que tienen objetos nesteds en su interior es mediante el método cloneDeep de lodash.

Para Angular, puedes hacerlo así:

Instale lodash con yarn add lodash o npm install lodash .

En tu componente, importa cloneDeep y cloneDeep :

 import * as cloneDeep from 'lodash/cloneDeep'; ... clonedObject = cloneDeep(originalObject); 

Solo se agregaron 18kb a su construcción, vale la pena por los beneficios.

También he escrito un artículo aquí , si necesita más información sobre por qué usar cloneDeep de lodash.

Como otros ya han señalado, usar lodash o subrayado es probablemente la mejor solución. Pero si no necesita esas bibliotecas para nada más, probablemente pueda usar algo como esto:

  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 

Eso es lo que decidimos hacer.

La solución más simple que he encontrado es:

 let yourDeepCopiedObject = _.cloneDeep(yourOriginalObject); 

* PASOS IMPORTANTES: debe instalar lodash para usar esto (que no estaba claro a partir de otras respuestas):

 $ npm install --save lodash $ npm install --save @types/lodash 

y luego importarlo en su archivo ts:

 import * as _ from "lodash"; 

Necesitaba esta característica solo formaba los ‘modelos’ de mi aplicación (datos de fondo sin procesar convertidos en objetos). Así que terminé usando una combinación de Object.create (crear un nuevo objeto a partir del prototipo especificado) y Object.assign (copiar propiedades entre los objetos). Necesita manejar la copia profunda manualmente. Creé una esencia para esto.