Zapisałem wszystkie dane otrzymane z usług bezpośrednio do zmiennej lokalnej, kontrolera lub zakresu. To, co, jak przypuszczam, można by uznać za płytką kopię, czy to prawda?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Niedawno powiedziano mi, żebym użył angular.copy w celu stworzenia głębokiej kopii.
$scope.example = angular.copy(response.data);
Jednak informacje głębokiej kopii wydają się działać w ten sam sposób, gdy są używane przez moją aplikację Angular. Czy korzystanie z głębokiej kopii (angular.copy) ma szczególne zalety i czy możesz mi je wyjaśnić?
javascript
angularjs
deep-copy
shallow-copy
Superman2971
źródło
źródło
Odpowiedzi:
Użyj angular.copy podczas przypisywania wartości obiektu lub tablicy do innej zmiennej i ta
object
wartość nie powinna być zmieniana.Bez głębokiego kopiowania lub używania angular.copy , zmiana wartości właściwości lub dodanie dowolnej nowej właściwości aktualizuje wszystkie obiekty odwołujące się do tego samego obiektu.
źródło
$scope.one = response.data
i ustaw$scope.two = response.data
. Więc zrób$scope.two.addProperty = something
. Powinienem prawdopodobnie to przetestować :), ale chciałbym uzyskać wgląd w społeczność.object property
aktualizacji nowej wartości na wszystkie obiekty mające to samo odniesienie. Dlatego musisz użyć angular.copyW takim przypadku nie musisz używać
angular.copy()
Wyjaśnienie :
=
reprezentuje odniesienie, podczas gdyangular.copy()
tworzy nowy obiekt jako głęboką kopię.Użycie
=
oznaczałoby, że zmiana właściwości ofresponse.data
zmieniłaby odpowiednią właściwość$scope.example
lub odwrotnie.Korzystanie z
angular.copy()
tych dwóch obiektów pozostawałoby odrębne, a zmiany nie odbijałyby się od siebie.źródło
Powiedziałbym, że
angular.copy(source);
w twojej sytuacji jest to niepotrzebne, jeśli później nie korzystasz z niego bez celuangular.copy(source, [destination]);
.https://docs.angularjs.org/api/ng/function/angular.copy
źródło
angular.copy()
do obiektu, aby uniemożliwić modyfikowanie go przez inny kod. Oryginalny obiekt może się zmienić, ale Twoja kopia nie zobaczy zmian. W razie potrzeby możesz przywrócić kopię.Podczas korzystania z angular.copy zamiast aktualizowania odniesienia tworzony jest nowy obiekt i przypisywany do miejsca docelowego (jeśli podano miejsce docelowe). Ale to nie wszystko. Jest taka fajna rzecz, która dzieje się po głębokiej kopii.
Załóżmy, że masz usługę fabryczną, która ma metody aktualizujące zmienne fabryczne.
i administratora korzystającego z tej usługi,
Po uruchomieniu powyższego programu dane wyjściowe będą wyglądać następująco:
Dlatego fajną rzeczą w używaniu kopii kątowej jest to, że odniesienia do miejsca docelowego są odzwierciedlane wraz ze zmianą wartości, bez konieczności ponownego ręcznego przypisywania wartości.
źródło
Wiem, że już odpowiedział, ale staram się tylko to uprościć. Więc angular.copy (data) możesz użyć w przypadku, gdy chcesz zmodyfikować / zmienić otrzymany obiekt, zachowując jego oryginalne wartości niezmienione / niezmienione.
Na przykład: załóżmy, że wykonałem wywołanie api i otrzymałem mój originalObj, teraz chcę zmienić wartości interfejsu API originalObj w niektórych przypadkach, ale chcę też oryginalnych wartości, więc mogę zrobić kopię mojego oryginalnego interfejsu API w duplicateObj i zmodyfikuj duplicateObj w ten sposób moje wartości originalObj nie zmienią się. W prostych słowach, modyfikacja duplicateObj nie będzie odzwierciedlać w originalObj, w przeciwieństwie do zachowania js obj.
Wynik jest taki ...
źródło
Dzielę się tutaj swoim doświadczeniem, użyłem angular.copy () do porównania właściwości dwóch obiektów. Pracowałem na wielu wejściach bez elementu formularza, zastanawiałem się, jak porównać właściwości dwóch obiektów i na podstawie wyniku muszę włączyć i wyłączyć przycisk Zapisz. Więc użyłem jak poniżej.
Przypisałem oryginalne wartości użytkownika obiektu serwera do mojego obiektu fałszywego, aby powiedzieć userCopy, i użyłem watch, aby sprawdzić zmiany w obiekcie użytkownika.
Moje API serwera, które pobiera mi dane z serwera:
Nie jestem pewien, ale porównanie dwóch obiektów było dla mnie naprawdę bólem głowy, ale z angular.copy () poszło gładko.
źródło
Javascript przekazuje zmienne
by reference
, co oznacza, że:Teraz, ponieważ
by reference
częśći
to [1], ij
jest również [1], mimo że tylkoi
została zmieniona. Dzieje się tak, ponieważ gdy mówimy, żej = i
javascript nie kopiujei
zmiennej i nie przypisuje jej,j
ale odwołuje się doi
zmiennej za pośrednictwemj
.Kopia kątowa pozwala stracić to odniesienie, co oznacza:
Teraz
i
równa się [1], podczas gdyj
nadal równa się [].Są sytuacje, w których taka
copy
funkcjonalność jest bardzo przydatna.źródło
angular.copy
jest bardziej inteligentny niż serializacja JSON, ponieważ może obsługiwać funkcje.