2013-05-09 3 views
5

Ich habe folgende JavaScript/Schräg Code:Angular JS: angular.copy stürzt der Browser, wenn ein Objekt ein anderes Objekt verweist

var a = {}; 
var b = {}; 
a.ref = b; 
b.ref = a; 
angular.copy(a); 

Wenn angular.copy Brände, der Browser abstürzt. Ich nehme an, dies liegt daran, dass die Kopierfunktion eine tiefe Kopie macht, und wenn sie beginnt, die Referenz von b zu kopieren, geht sie in b und möchte dann ihre Referenz von a kopieren, um so eine zirkuläre Kopie zu erstellen, die dies niemals tun wird Ende.

Ist diese Annahme richtig? Wenn ja, gibt es eine Möglichkeit, dies zu vermeiden? Ich gehe davon aus, dass die Antwort die Art und Weise verändern wird, wie meine Daten aussehen, aber ich bin neugierig, die Gedanken einer anderen Person zu hören.

Antwort

2

Ihre Annahme ist richtig, das Problem ist der Zirkelbezug. JSON.stringify wird sich auch über diese Struktur beschweren. jQuery.extend erkennt Kreisreferenzen auf einer sehr grundlegenden Ebene und kann hier Ihr grundlegendes Beispiel behandeln, aber jQuery.extend has its own issues as well. Wenn Sie bereits jQuery verwenden, können Sie einfach erweitern verwenden, aber ansonsten kann man sich etwas zu schreiben, selbst suchen möchten, oder können Sie diese Phantasie cloneObject Funktion verwende ich über Google gefunden:

https://gist.github.com/NV/1396086

+0

Interessant. Danke, dass Sie meine Vermutung geklärt haben. Klingt wie die Struktur meiner Daten sollte nur geändert werden ... – incutonez

+0

Ist das, wie Sie es behoben? Konnten Sie es mit einer Zirkelreferenz arbeiten lassen? – testing123

+0

Wir haben es behoben, indem wir unser Datenmodell überarbeitet haben. Anstatt dem Kindknoten das eigentliche Elternobjekt zu geben, fügten wir jedem Kind einen Kindknoten und eine Elternknoten-ID hinzu. Wenn wir Enkelkinder erstellen, ist es einfach, die Eltern-ID weiterzugeben. – incutonez