Wie kann ich ein Objekt kopieren und seine Referenz in Angular verlieren?
Mit AngularJS kann ich verwenden angular.copy(object)
, aber ich erhalte einen Fehler, wenn ich das in Angular verwende.
AUSNAHME: ReferenceError:
angular
ist nicht definiert
.copy()
, benötigen es jedoch nicht. In verschiedenen AngJS1-Projekten, die ich gesehen habe, war es ein Overkill, bei dem eine manuelle Kopie der relevanten Unterstrukturen für einen saubereren Code gesorgt hätte. Vielleicht war das Teil der Entscheidung, es vom Angular-Team nicht umzusetzen.Antworten:
Angenommen, Sie verwenden ES6, können Sie verwenden
var copy = Object.assign({}, original)
. Funktioniert in modernen Browsern; Wenn Sie ältere Browser unterstützen müssen, sehen Sie sich diese Polyfüllung anaktualisieren:
Mit TypeScript 2.1+ ist die ES6-Kurzschreibobjekt-Notationsnotation verfügbar:
quelle
angular.copy()
Gegensatz zu eine tiefe Kopie erstellt wirdObject.assign()
. Wenn Sie eine tiefe Kopie wünschen, verwenden Sie lodash_.cloneDeep(value)
lodash.com/docs#cloneDeepUnresolved function or method assign()
; IDE-Details: Webstorm 2016.2. Wie kann ich das lösen?File -> Settings -> Languages & Frameworks -> Javascript
und setzeJavascript language version
aufECMAScript 6.0
.const copy = [ ...original ]
Bis wir eine bessere Lösung haben, können Sie Folgendes verwenden:
EDIT: Klarstellung
Bitte beachten Sie: Die obige Lösung war nur als Schnellreparatur-Einzeiler gedacht, der zu einem Zeitpunkt bereitgestellt wurde, als Angular 2 in der aktiven Entwicklung war. Meine Hoffnung war, dass wir irgendwann ein Äquivalent von bekommen könnten
angular.copy()
. Daher wollte ich keine Deep-Cloning-Bibliothek schreiben oder importieren.Diese Methode hat auch Probleme mit dem Parsen von Datumseigenschaften (es wird eine Zeichenfolge).
Bitte verwenden Sie diese Methode nicht in Produktions-Apps . Verwenden Sie es nur in Ihren experimentellen Projekten - denjenigen, die Sie zum Erlernen von Angular 2 ausführen.
quelle
Die Alternative zum tiefen Kopieren von Objekten mit verschachtelten Objekten besteht in der Verwendung der cloneDeep-Methode von lodash.
Für Angular können Sie dies folgendermaßen tun:
Installieren Sie lodash mit
yarn add lodash
odernpm install lodash
.Importieren
cloneDeep
und verwenden Sie es in Ihrer Komponente :Es sind nur 18 KB zu Ihrem Build hinzugefügt, was sich für die Vorteile lohnt.
Ich habe hier auch einen Artikel geschrieben , wenn Sie mehr darüber erfahren möchten, warum Sie lodashs cloneDeep verwenden.
quelle
cloneDeep
Methode ein neues Objekt instanziiert. Sollten wir es trotzdem verwenden, wenn wir bereits ein Zielobjekt haben?Zum flachen Kopieren können Sie Object.assign verwenden, eine ES6-Funktion
Verwenden Sie es NICHT zum tiefen Klonen
quelle
Verwenden Sie lodash wie angegeben. Der Grund, warum Angular diese Methode nicht mehr hat, ist, dass Angular 1 ein eigenständiges Framework war und externe Bibliotheken häufig auf Probleme mit dem Winkelausführungskontext stießen. Angular 2 hat dieses Problem nicht. Verwenden Sie daher die gewünschte Bibliothek.
https://lodash.com/docs#cloneDeep
quelle
Wenn Sie eine Klasseninstanz kopieren möchten, können Sie auch Object.assign verwenden, müssen jedoch eine neue Instanz als ersten Parameter übergeben (anstelle von {}):
quelle
Die einfachste Lösung, die ich gefunden habe, ist:
* WICHTIGE SCHRITTE : Sie müssen lodash installieren, um dies zu verwenden (was aus anderen Antworten nicht ersichtlich war):
und importieren Sie es dann in Ihre ts-Datei:
quelle
Wie andere bereits betont haben, ist die Verwendung von Lodash oder Unterstrich wahrscheinlich die beste Lösung. Wenn Sie diese Bibliotheken jedoch für nichts anderes benötigen, können Sie wahrscheinlich Folgendes verwenden:
Dafür haben wir uns entschieden.
quelle
Ich brauchte diese Funktion nur aus meinen App-Modellen (in Objekte konvertierte Backend-Rohdaten). Daher habe ich eine Kombination aus Object.create (neues Objekt aus angegebenem Prototyp erstellen) und Object.assign ( Kopiereigenschaften zwischen Objekten) verwendet. Die tiefe Kopie muss manuell bearbeitet werden. Ich habe einen Kern dafür erstellt.
quelle
Hatte das gleiche Problem und wollte keine Plugins nur zum tiefen Klonen verwenden:
Credits: Ich habe diese Funktion besser lesbar gemacht . Bitte überprüfen Sie die Ausnahmen zu ihrer Funktionalität unten
quelle
Ich habe einen Dienst für Angular 5 oder höher erstellt. Er verwendet die
angular.copy ()
Basis von AngularJS und funktioniert gut für mich. Zusätzlich gibt es andere Funktionen wieisUndefined
usw. Ich hoffe es hilft. Wie bei jeder Optimierung wäre es schön zu wissen. Grüßequelle
Ich und Sie hatten ein Problem mit der Arbeit angular.copy und angular.expect, da sie das Objekt nicht kopieren oder erstellen, ohne einige Abhängigkeiten hinzuzufügen. Meine Lösung war folgende:
quelle
Die
JSON.stringify()
Methode konvertiert ein JavaScript-Objekt oder einen JavaScript-Wert in eine JSON-Zeichenfolgequelle
Sie können das Array wie folgt klonen
Und klonen Sie das Objekt wie
quelle
Wenn Sie lodash noch nicht verwenden, würde ich nicht empfehlen, es nur für diese eine Methode zu installieren. Ich schlage stattdessen eine eng spezialisierte Bibliothek wie "Klon" vor:
quelle