296 votes

Que représente la $$hashKey ajoutée à mon résultat JSON.stringify

J'ai essayé de chercher sur le site Mozilla JSON stringify J'ai consulté la page de leur documentation ainsi qu'ici sur SO et Google mais je n'ai trouvé aucune explication. J'ai utilisé JSON.stringify plusieurs fois mais je n'ai jamais rencontré ce résultat.

J'ai un tableau d'objets 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"
    }
]

Il est attaché à mon $scope . Afin de POST comme un seul paramètre, j'ai utilisé le JSON.stringify() et recevoir ce qui suit :

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

Je suis juste curieux de savoir ce que le $$hashkey est exactement, car je m'attendais à quelque chose de plus similaire à ce qui suit à partir de la propriété stringify (c'est-à-dire sans la méthode $$hashkey ):

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

Je ne sais pas si c'est un facteur, mais j'utilise ce qui suit :

  • Angularjs 1.1.5,
  • JQuery 1.8.2
  • Spring 3.0.4

J'utilise également Spring security 3.0.7 du côté du serveur.

Il ne me pose aucun problème, mais j'aimerais connaître la cause et la raison de l'apparition de l'événement. $$hashkey

8 votes

Il est ajouté par angularjs

1 votes

72 votes

Au lieu de JSON.stringify, utilisez angular.toJson()

545voto

David Boike Points 7528

Angular l'ajoute pour garder la trace de vos changements, afin de savoir quand il doit mettre à jour le DOM.

Si vous utilisez angular.toJson(obj) au lieu de JSON.stringify(obj) Angular éliminera ces valeurs à usage interne pour vous.

De même, si vous modifiez votre expression de répétition pour utiliser l'option track by {uniqueProperty} Angular n'aura pas à ajouter le suffixe $$hashKey du tout. Par exemple

<ul>
    <li ng-repeat="link in navLinks track by link.href">
        <a ng-href="link.href">{{link.title}}</a>
    </li>
</ul>

N'oubliez jamais que vous avez besoin de la partie "lien." de l'expression - j'ai toujours tendance à l'oublier. Juste track by href ne fonctionnera sûrement pas.

0 votes

Existe-t-il des tests de performance entre "track by" et "$$hashKey" ? (UPD. Ok, j'ai fait une recherche sur Google et "track by" est plus préférable).

0 votes

@artuska le suivi par id est très simple car aucun hash n'a à être calculé, il suffit de réutiliser les ids existants ou d'incrémenter un compteur...

3 votes

Et si vous avez un filtre à appliquer, voici l'ordre correct : item in somelist | filter:somefilter track by item.key ne pas écrire le filtre à la fin de la ligne !

72voto

RobE Points 380

Dans mon cas d'utilisation (alimentation de l'objet résultant vers X2JS), l'approche recommandée est la suivante

data = angular.toJson(source);

aider à supprimer le $$hashKey mais le résultat ne pouvait alors plus être traité par X2JS .

data = angular.copy(source);

a retiré le $$hashKey également, mais le résultat reste utilisable comme paramètre pour X2JS.

37voto

Thomas Pons Points 3071

Il est généralement accompagné de la directive ng-repeat. Pour faire de la manipulation de dom, AngularJS marque les objets avec un id spécial.

C'est courant avec Angular. Par exemple, si vous obtenez un objet avec ngResource, votre objet intégrera toute l'API des ressources et vous verrez des méthodes comme $save, etc. Avec les cookies aussi, AngularJS ajoutera une propriété __ngDebug.

0 votes

Comment puis-je supprimer ces propriétés ? Est-ce qu'Angular fournit un moyen de le faire ?

1 votes

Les modèles Angular se casseront si vous essayez de supprimer cette propriété, je recommande de copier la variable. Voir la réponse de @David-Boike sur la façon de filtrer la clé de hachage.

24voto

Si vous ne souhaitez pas ajouter d'identifiants à vos données, vous pouvez effectuer un suivi en fonction de l'index du tableau, ce qui aura pour effet d'attribuer une clé aux éléments en fonction de leur position dans le tableau et non de leur valeur.

Comme ça :

var myArray = [1,1,1,1,1];

<li ng-repeat="item in myArray track by $index">

0 votes

Cela suppose que l'ordre de vos articles ne changera jamais :)

8voto

Ajay Ullal Points 346

Si vous utilisez Angular 1.3 ou supérieur, je vous recommande d'utiliser "track by" dans votre ng-repeat. Angular n'ajoute pas une propriété "$$hashKey" aux objets de votre tableau si vous utilisez "track by". Vous bénéficiez également d'avantages en termes de performances, si quelque chose dans votre tableau change, Angular ne recrée pas toute la structure du DOM pour votre ng-repeat, il recrée plutôt la partie du DOM pour les valeurs de votre tableau qui ont changé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X