Próbowałem przeglądać na swoich stronach dokumentacyjnych Mozilli JSON strify, a także tutaj w SO i Google, ale nie znalazłem wyjaśnienia. Używałem JSOn stringify wiele razy, ale nigdy nie natknąłem się na ten wynik
Mam tablicę obiektów JSON
[
{
"param_2": "Description 1",
"param_0": "Name 1",
"param_1": "VERSION 1"
},
{
"param_2": "Description 2",
"param_0": "Name 2",
"param_1": "VERSION 2"
},
{
"param_2": "Description 3",
"param_0": "Name 3",
"param_1": "VERSION 3"
}
]
dołączony do mojego $scope
i aby POST
je jako jeden parametr użyłem metody JSON.stringify () i otrzymuję:
[
{
"param_2": "Description 1",
"param_0": "Name 1",
"param_1": "VERSION 1",
"$$hashKey": "005"
},
{
"param_2": "Description 2",
"param_0": "Name 2",
"param_1": "VERSION 2",
"$$hashKey": "006"
},
{
"param_2": "Description 3",
"param_0": "Name 3",
"param_1": "VERSION 3",
"$$hashKey": "007"
}
]
Jestem tylko ciekawy, co to właściwie jest hash $$, ponieważ spodziewałem się czegoś bardziej podobnego do następującego po metodzie stringify:
[
{
"1":{
"param_2": "Description 1",
"param_0": "Name 1",
"param_1": "VERSION 1"
},
"2":{
"param_2": "Description 2",
"param_0": "Name 2",
"param_1": "VERSION 2"
},
"3":{
"param_2": "Description 3",
"param_0": "Name 3",
"param_1": "VERSION 3"
}
}
]
Nie jestem pewien, czy to czynnik, ale używam Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side
Nie powoduje to żadnych problemów, ale chciałbym poznać przyczynę i przyczynę $$hashkey
javascript
jquery
json
angularjs
jonnie
źródło
źródło
Odpowiedzi:
Angular dodaje to, aby śledzić zmiany, dzięki czemu wie, kiedy musi zaktualizować DOM.
Jeśli użyjesz
angular.toJson(obj)
zamiastJSON.stringify(obj)
tego, Angular usunie te wewnętrzne wartości dla ciebie.Ponadto, jeśli zmienisz wyrażenie wielokrotne w celu użycia
track by {uniqueProperty}
przyrostka, Angular nie będzie musiał wcale dodawać$$hashKey
. Na przykładPamiętaj tylko, że potrzebujesz „linku”. część wyrażenia - zawsze o tym zapominam. Na
track by href
pewno nie zadziała.źródło
item in somelist | filter:somefilter track by item.key
nie pisz filtra na końcu wiersza!W moim przypadku użycia (podawanie wynikowego obiektu do X2JS) zalecane podejście
pomagają usunąć
$$hashKey
właściwości, ale wynik nie może być już przetworzony przez X2JS .usunął również
$$hashKey
właściwości, ale wynik pozostał użyteczny jako parametr dla X2JS.źródło
Zwykle pochodzi z dyrektywą ng-repeat. Aby wykonać manipulację domem, AngularJS zaznacza obiekty specjalnym identyfikatorem.
Jest to typowe dla Angulara. Na przykład, jeśli dostaniesz obiekt za pomocą ngResource, twój obiekt osadzi wszystkie API zasobów, a zobaczysz metody takie jak $ save, itp. W przypadku ciasteczek też AngularJS doda właściwość __ngDebug.
źródło
Jeśli nie chcesz dodawać identyfikatorów do swoich danych, możesz śledzić według indeksu w tablicy, co spowoduje, że elementy będą kluczowane przez ich pozycję w tablicy zamiast ich wartości.
Lubię to:
źródło
Jeśli używasz Angulara 1.3 lub nowszego, zalecamy użycie opcji „śledź przez” w powtórzeniu ng. Angular nie dodaje właściwości „$$ hashKey” do obiektów w tablicy, jeśli używasz opcji „śledź według”. Uzyskujesz również korzyści w zakresie wydajności, jeśli coś w tablicy się zmieni, kąt nie odtworzy całej struktury DOM dla twojego powtórzenia ng, zamiast tego odtworzy część DOM dla wartości w tablicy, które uległy zmianie.
źródło
Aktualizacja: Od Angular v1.5, śledzenie według
$index
jest teraz standardową składnią zamiast używania linku, ponieważ dał ming-repeat
błąd duplikatów.Wpadłem na to dla zagnieżdżonego
ng-repeat
i poniższe zadziałało.źródło
Oto, jak możesz łatwo usunąć $$ hashKey z obiektu:
$scope.myObject
- Odnosi się do obiektu, na którym chcesz wykonać operację, tj. Usunąć klucz hash $$$scope.myNewObject
- Przypisz zmodyfikowany oryginalny obiekt do nowego obiektu, aby można go było użyć w razie potrzebyźródło
https://www.timcosta.io/angular-js-object-comparisons/
Angular jest dość magiczny, kiedy ludzie go widzą po raz pierwszy. Automatyczne aktualizacje DOM po aktualizacji zmiennej w JS, a ta sama zmienna zostanie zaktualizowana w pliku JS, gdy ktoś zaktualizuje jej wartość w DOM. Ta sama funkcjonalność działa w przypadku elementów strony i kontrolerów.
Kluczem do tego wszystkiego jest $$ hashKey Angular dołączany do obiektów i tablic używanych w powtórzeniach ng.
Ten $$ hashKey powoduje wiele zamieszania dla osób, które wysyłają pełne obiekty do interfejsu API, który nie usuwa dodatkowych danych. API zwróci 400 dla wszystkich twoich żądań, ale ten hashKey $$ po prostu nie odejdzie od twoich obiektów.
Angular używa $$ hashKey do śledzenia, które elementy w DOM należą do którego elementu w tablicy, która jest zapętlana w powtórzeniu ng. Bez $$ hashKey Angular nie miałby możliwości zastosowania zmian, które wystąpiłyby w JavaScript lub DOM w ich odpowiedniku, co jest jednym z głównych zastosowań Angulara.
Rozważ tę tablicę:
Jeśli wyrenderowaliśmy to na liście za pomocą ng-repeat = "użytkownik w użytkownikach", każdy obiekt w nim otrzymałby $$ hashKey do celów śledzenia od Angular. Oto dwa sposoby uniknięcia tego hashKey $$.
źródło