2013-05-09 21 views
5

Mam następujący kod JavaScript/kątowa:kątowe JS: angular.copy wywala przeglądarkę, gdy obiekt odwołuje inny obiekt

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

Kiedy angular.copy pożary, przeglądarka blokuje. Zakładam, że dzieje się tak dlatego, że funkcja kopiowania wykonuje głęboką kopię, a kiedy zaczyna kopiować referencję b, przechodzi do b, a następnie chce skopiować swoje odniesienie do a, tworząc w ten sposób kopię cykliczną, która nigdy nie będzie koniec.

Czy to założenie jest prawidłowe? Jeśli tak, czy istnieje sposób, aby tego uniknąć? Zakładam, że odpowiedź będzie polegać na zmianie sposobu w jaki moje dane wyglądają, ale jestem ciekawy, jak słyszę myśli innej osoby.

Odpowiedz

2

Twoje założenie jest słuszne, problemem jest okólnik. JSON.stringify również będzie narzekać na tę strukturę. jQuery.extend wykrywa odwołania kołowe na bardzo podstawowym poziomie i może obsługiwać podstawowy przykład tutaj, ale jQuery.extend has its own issues as well. Jeśli już przy użyciu jQuery, można po prostu użyć przedłużyć, ale poza tym można zajrzeć do pisania czegoś samemu, lub można skorzystać z tej funkcji ozdobnego cloneObject znalazłem przez Google:

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

+0

Interesujące. Dziękuję za wyjaśnienie mojego założenia. Wygląda na to, że struktura moich danych powinna zostać zmieniona ... – incutonez

+0

Czy to naprawiłeś? Czy byłeś w stanie pracować z okrągłym odnośnikiem? – testing123

+0

Naprawiliśmy to, zmieniając nasz model danych. Zamiast nadawać węzłowi potomnemu rzeczywisty obiekt nadrzędny, do każdego dziecka dodaliśmy węzeł podrzędny i identyfikator węzła nadrzędnego ... więc kiedy zaczynamy tworzyć wnuki, łatwo jest przekazać identyfikator rodzica. – incutonez