J'ai essayé de chercher sur la page Mozilla JSON stringify de leurs documents 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"
}
]
attaché à mon $scope
et pour POST
eux en tant que paramètre, j'ai utilisé la méthode JSON.stringify () et j'obtiens 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 qu'est exactement le hashkey $$ car je m'attendais à quelque chose de plus similaire à ce qui suit de la méthode 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"
}
}
]
Je ne sais pas si c'est un facteur mais j'utilise Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side
Cela ne me pose aucun problème, mais j'aimerais connaître la cause et la raison de la $$hashkey
la source
Réponses:
Angular ajoute ceci pour garder une trace de vos modifications, afin qu'il sache quand il doit mettre à jour le DOM.
Si vous utilisez
angular.toJson(obj)
au lieu deJSON.stringify(obj)
alors Angular supprimera ces valeurs à usage interne pour vous.De plus, si vous modifiez votre expression de répétition pour utiliser le
track by {uniqueProperty}
suffixe, Angular n'aura pas du tout à ajouter$$hashKey
. Par exempleRappelez-vous toujours que vous avez besoin du "lien". une partie de l'expression - j'ai toujours tendance à l'oublier. Ne fonctionnera
track by href
sûrement pas.la source
item in somelist | filter:somefilter track by item.key
n'écrivez pas le filtre à la fin de la ligne!Dans mon cas d'utilisation (alimentation de l'objet résultant vers X2JS), l'approche recommandée
aide à supprimer les
$$hashKey
propriétés, mais le résultat ne peut alors plus être traité par X2JS .a également supprimé les
$$hashKey
propriétés, mais le résultat est resté utilisable comme paramètre pour X2JS.la source
Il est généralement livré avec la directive ng-repeat. Pour effectuer une manipulation dom, AngularJS marque les objets avec un identifiant spécial.
C'est commun avec Angular. Par exemple, si vous obtenez un objet avec ngResource, votre objet incorporera toutes les API de ressources et vous verrez des méthodes comme $ save, etc. Avec les cookies aussi, AngularJS ajoutera une propriété __ngDebug.
la source
Si vous ne souhaitez pas ajouter d'ID à vos données, vous pouvez effectuer le suivi par l'index dans le tableau, ce qui entraînera la saisie des éléments par leur position dans le tableau au lieu de leur valeur.
Comme ça:
la source
Si vous utilisez Angular 1.3 ou supérieur, je vous recommande d'utiliser "track by" dans votre ng-repeat. Angular n'ajoute pas de propriété "$$ hashKey" aux objets de votre tableau si vous utilisez "track by". Vous obtenez également des avantages en termes de performances, si quelque chose dans votre tableau change, angular ne recrée pas la structure DOM entière pour votre ng-repeat, il recrée à la place la partie du DOM pour les valeurs de votre tableau qui ont changé.
la source
Mise à jour: à partir d'Angular v1.5, track by
$index
est maintenant la syntaxe standard au lieu d'utiliser le lien car cela m'a donné uneng-repeat
erreur de dupes.Je suis tombé sur cela pour un nid
ng-repeat
et le ci-dessous a fonctionné.la source
Voici comment supprimer facilement la clé de hachage $$ de l'objet:
$scope.myObject
- Fait référence à l'objet sur lequel vous souhaitez effectuer l'opération, c'est-à-dire supprimez la clé de hachage $$ de$scope.myNewObject
- Attribuez l'objet d'origine modifié au nouvel objet afin qu'il puisse être utilisé si nécessairela source
https://www.timcosta.io/angular-js-object-comparisons/
Angular est assez magique la première fois que les gens le voient. Les mises à jour DOM automatiques lorsque vous mettez à jour une variable dans votre JS, et la même variable sera mise à jour dans votre fichier JS lorsque quelqu'un met à jour sa valeur dans le DOM. Cette même fonctionnalité fonctionne sur tous les éléments de la page et sur tous les contrôleurs.
La clé de tout cela est l'attachement $$ hashKey Angular aux objets et aux tableaux utilisés dans ng-repeats.
Cette clé de hachage $$ provoque beaucoup de confusion pour les personnes qui envoient des objets complets à une API qui ne supprime pas les données supplémentaires. L'API renverra un 400 pour toutes vos demandes, mais cette clé de hachage $$ ne s'éloignera pas de vos objets.
Angular utilise la clé de hachage $$ pour garder une trace des éléments du DOM qui appartiennent à quel élément d'un tableau en boucle dans une répétition ng. Sans le $$ hashKey Angular, il n'y aurait aucun moyen d'appliquer les modifications qui se produisent dans le JavaScript ou le DOM à leur homologue, ce qui est l'une des principales utilisations d'Angular.
Considérez ce tableau:
Si nous rendions cela dans une liste en utilisant ng-repeat = "user in users", chaque objet qu'il contient recevrait une clé de hachage $$ à des fins de suivi d'Angular. Voici deux façons d'éviter ce $$ hashKey.
la source