Che cosa è il $$ hashKey aggiunto al mio risultato JSON.stringify

Ho provato a cercare sulla pagina stringify di Mozilla JSON dei loro documenti così come su SO e Google ma non ho trovato alcuna spiegazione. Ho usato JSOn per stringificare molte volte ma non ho mai incontrato questo risultato

Ho una serie di oggetti 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" } ] 

collegato al mio $scope e al fine di inviarlo come parametro ho usato il metodo JSON.stringify () e ottengo il seguente:

  [ { "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" } ] 

Sono solo curioso di cosa sia esattamente l’hashkey $$ come mi aspettavo qualcosa di più simile al seguente dal metodo 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" } } ] 

Non sono sicuro che sia un fattore, ma sto utilizzando Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side

Non mi sta causando alcun problema, ma mi piacerebbe conoscere la causa e la ragione per l’ $$hashkey

Angular aggiunge questo per tenere traccia delle modifiche, quindi sa quando è necessario aggiornare il DOM.

Se usi angular.toJson(obj) invece di JSON.stringify(obj) allora Angular JSON.stringify(obj) questi valori di uso interno.

Inoltre, se cambi la tua espressione di ripetizione per usare la track by {uniqueProperty} suffisso track by {uniqueProperty} , Angular non dovrà aggiungere $$hashKey . Per esempio

  

Ricorda sempre che hai bisogno del “link”. parte dell’espressione – tendo sempre a dimenticarlo. Solo la track by href sicuramente non funzionerà.

Nel mio caso d’uso (alimentando l’object risultante a X2JS) l’approccio raccomandato

 data = angular.toJson(source); 

aiuta a rimuovere le proprietà $$hashKey , ma il risultato non può più essere elaborato da X2JS .

 data = angular.copy(source); 

rimosso anche le proprietà $$hashKey , ma il risultato è rimasto utilizzabile come parametro per X2JS.

Di solito viene con la direttiva ng-repeat. Per manipolare dom AngularJS contrassegna gli oggetti con un ID speciale.

Questo è comune con Angular. Ad esempio se ottieni object con ngResource il tuo object incorporerà tutta l’API di risorsa e vedrai metodi come $ save, ecc. Con i cookie anche AngularJS aggiungerà una proprietà __ngDebug.

Se non si desidera aggiungere ID ai dati, è ansible tenere traccia dell’indice nell’array, il che causerà la codifica degli elementi in base alla posizione nell’array anziché al valore.

Come questo:

 var myArray = [1,1,1,1,1]; 
  • Se stai utilizzando Angular 1.3 o versioni successive, ti consiglio di utilizzare “track by” nella tua ng-repeat. Angular non aggiunge una proprietà “$$ hashKey” agli oggetti nell’array se si utilizza “track by”. Otterrete anche vantaggi prestazionali, se qualcosa nella vostra matrice cambia, angular non ricrea l’intera struttura DOM per la vostra ng-repeat, ma ricrea la parte del DOM per i valori nella vostra matrice che sono cambiati.

    Aggiornamento: da Angular v1.5, track by $index è ora la syntax standard invece di usare link in quanto mi ha dato un errore di dupes ng-repeat .

    Mi sono imbattuto in questo per una ng-repeat nidificata e il sotto funzionava.

       {{row[field.caption] }}  

    https://www.timcosta.io/angular-js-object-comparisons/

    Angular è piuttosto magico la prima volta che la gente lo vede. Aggiornamenti automatici DOM quando aggiorni una variabile nel tuo JS e la stessa variabile si aggiorna nel tuo file JS quando qualcuno aggiorna il suo valore nel DOM. Questa stessa funzionalità funziona tra gli elementi della pagina e tra i controller.

    La chiave di tutto questo è il $$ hashKey Angular attribuisce agli oggetti e agli array usati nelle ripetizioni ng.

    Questo hashKey $$ causa molta confusione per le persone che inviano oggetti completi a un’API che non elimina i dati aggiuntivi. L’API restituirà un 400 per tutte le tue richieste, ma quel $$ hashKey non uscirà dai tuoi oggetti.

    Angular utilizza $$ hashKey per tenere traccia di quali elementi nel DOM appartengono a quale elemento in una matrice viene sottoposta a loop in una ng-repeat. Senza il $$ hashKey Angular non avrebbe modo di applicare le modifiche che avvengono nel JavaScript o nel DOM alla loro controparte, che è uno degli usi principali di Angular.

    Considera questo array:

     users = [ { first_name: "Tim" last_name: "Costa" email: "[email protected]" } ] 

    Se lo abbiamo reso in una lista usando ng-repeat = “utente negli utenti”, ogni object in esso riceverà un hashkey $$ per scopi di tracciamento da Angular. Ecco due modi per evitare questo $$ hashKey.

    Ecco come rimuovere facilmente l’hashKey $$ dall’object:

     $scope.myNewObject = JSON.parse(angular.toJson($scope.myObject)) 

    $scope.myObject$scope.myObject riferimento all’object su cui si desidera eseguire l’operazione, ovvero rimuovere l’hashkey $ da

    $scope.myNewObject – Assegna l’object originale modificato al nuovo object in modo che possa essere utilizzato secondo necessità