我已尝试查看其文档的Mozilla JSON stringify页面以及此处的SO和Google,但未找到任何解释。我已经多次使用JSOn stringify但从未遇到过这个结果
我有一个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"
}
]
附加到我的$scope
,为了POST
他们作为一个参数我使用了JSON.stringify()方法,我得到以下内容:
[
{
"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"
}
]
我很好奇究竟是什么是$$ hashkey,因为我期望与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"
}
}
]
我不确定这是否是一个因素,但我使用的是Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side
这不会引起任何问题,但我想知道$$hashkey
答案 0 :(得分:513)
Angular添加了这个以跟踪您的更改,因此它知道何时需要更新DOM。
如果您使用angular.toJson(obj)
代替JSON.stringify(obj)
,则Angular会为您删除这些内部使用值。
此外,如果您更改重复表达式以使用track by {uniqueProperty}
后缀,Angular将不必添加$$hashKey
。例如
<ul>
<li ng-repeat="link in navLinks track by link.href">
<a ng-href="link.href">{{link.title}}</a>
</li>
</ul>
永远记住你需要“链接”。表达的一部分 - 我总是倾向于忘记这一点。只是track by href
肯定无法正常工作。
答案 1 :(得分:69)
在我的用例中(将生成的对象提供给X2JS)推荐的方法
data = angular.toJson(source);
帮助删除$$hashKey
属性,但X2JS无法再处理结果。
data = angular.copy(source);
也删除了$$hashKey
属性,但结果仍可用作X2JS的参数。
答案 2 :(得分:37)
通常带有ng-repeat指令。要进行dom操作,AngularJS会标记具有特殊ID的对象。
这与Angular很常见。例如,如果您使用ngResource获取对象,您的对象将嵌入所有资源API,您将看到$ save等方法。对于Cookie,AngularJS将添加属性__ngDebug。
答案 3 :(得分:23)
如果您不想在数据中添加ID,则可以按数组中的索引进行跟踪,这会导致项目按其在数组中的位置而不是其值来键入
像这样:
var myArray = [1,1,1,1,1];
<li ng-repeat="item in myArray track by $index">
答案 4 :(得分:8)
如果您使用的是Angular 1.3或更高版本,我建议您使用&#34; track by&#34;在你的重复。 Angular没有添加&#34; $$ hashKey&#34;如果使用&#34; track by&#34;,则为数组中对象的属性。您还可以获得性能优势,如果数组中的某些内容发生更改,则角度不会为ng-repeat重新创建整个DOM结构,而是会为数组中已更改的值重新创建DOM的一部分。
答案 5 :(得分:4)
更新:从Angular v1.5开始,generator
跟踪现在是标准语法,而不是使用链接,因为它给了我一个$index
欺骗错误。
我遇到了嵌套ng-repeat
以及下面的工作。
ng-repeat
答案 6 :(得分:1)
https://www.timcosta.io/angular-js-object-comparisons/
Angular在人们第一次看到它时非常神奇。更新JS中的变量时自动更新DOM,当有人在DOM中更新其值时,相同的变量将在JS文件中更新。相同的功能适用于页面元素和控制器。
所有这一切的关键是$$ hashKey Angular附加到ng-repeats中使用的对象和数组。
对于将完整对象发送到不剥离额外数据的API的人来说,这个$$ hashKey会引起很多混乱。 API将为您的所有请求返回400,但是$$ hashKey不会离开您的对象。
Angular使用$$ hashKey来跟踪DOM中哪些元素属于在ng-repeat中循环的数组中的哪个项目。如果没有$$ hashKey,Angular将无法将JavaScript或DOM中发生的更改应用于其对应项,这是Angular的主要用途之一。
考虑这个数组:
users = [
{
first_name: "Tim"
last_name: "Costa"
email: "tjsail33@gmail.com"
}
]
如果我们使用用户&#34;中的ng-repeat =&#34; user将其呈现为列表,则其中的每个对象都将从Angular接收$$ hashKey以进行跟踪。以下两种方法可以避免使用这个$$ hashKey。
答案 7 :(得分:1)
以下是如何从对象中轻松删除$$ hashKey:
$scope.myNewObject = JSON.parse(angular.toJson($scope.myObject))
$scope.myObject
- 指想要执行操作的对象,即从
$scope.myNewObject
- 将修改后的原始对象分配给新对象,以便可以根据需要使用