什么是$ $$ hashKey添加到我的JSON.stringify结果
我曾尝试寻找他们的文档的Mozilla JSON stringify页面以及SO和Google的这里,但没有find任何解释。 我已经使用JSOn很多时间,但从来没有遇到过这个结果
我有一个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
和为了发布他们作为一个参数我使用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
使用Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side
这不是导致我任何问题,但我想知道$$hashkey
的原因和原因
Angular增加了这个来跟踪你的改变,所以它知道什么时候需要更新DOM。
如果您使用angular.toJson(obj)
而不是JSON.stringify(obj)
那么Angular将为您删除这些内部使用的值。
此外,如果您track by {uniqueProperty}
后缀更改重复expression式以使用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>
只要永远记住你需要“链接”。 expression的一部分 – 我总是倾向于忘记这一点。 只需track by href
肯定不会工作。
在我的使用情况下(将产生的对象提供给X2JS)推荐的方法
data = angular.toJson(source);
帮助删除$$hashKey
属性,但结果可能不再由X2JS处理。
data = angular.copy(source);
也删除了$$hashKey
属性,但结果仍然可用作X2JS的参数。
它通常带有ng-repeat指令。 做dom操作AngularJS标记具有特殊id的对象。
这在Angular中很常见。 例如,如果你用ngResource获得对象,你的对象将embedded所有的资源API,你会看到像$ save等方法。同样,Cookie也会添加一个属性__ngDebug。
如果您不想将数据添加到数据中,您可以使用数组中的索引进行跟踪,这将导致项目按照在数组中的位置而不是其值。
喜欢这个:
var myArray = [1,1,1,1,1]; <li ng-repeat="item in myArray track by $index">
如果您使用的是Angular 1.3或更高版本,我build议您在ng-repeat中使用“track by”。 如果使用“track by”,Angular不会为数组中的对象添加“$$ hashKey”属性。 你也可以获得性能上的好处,如果你的数组中的内容发生了变化,angular并不会为你的ng-repeat重新创build整个DOM结构,它将为你的数组中已经改变的值重新创buildDOM的一部分。
更新:从Angular v1.5开始,跟踪$index
现在是标准语法,而不是使用链接,因为它给了我一个ng-repeat
dupes错误。
我遇到了这个嵌套ng-repeat
和下面的工作。
<tbody> <tr ng-repeat="row in data track by $index"> <td ng-repeat="field in headers track by $index">{{row[field.caption] }}</td> </tr>
https://www.timcosta.io/angular-js-object-comparisons/
人们第一次看到Angular就相当神奇。 在更新JS中的variables时自动更新DOM,当有人更新其在DOM中的值时,同样的variables将在您的JS文件中更新。 这个相同的function在页面元素和控制器之间起作用。
所有这一切的关键是$$ hashKey Angular附加到ng-repeats中使用的对象和数组。
对于将完整对象发送到不剥除额外数据的API的人来说,这个$$ hashKey会引起很多混淆。 API将为您的所有请求返回一个400,但该$$ hashKey只是不会离开您的对象。
Angular使用$$ hashKey来跟踪DOM中的哪些元素属于循环的数组中的哪个项目。 如果没有$$ hashKey Angular将无法将JavaScript或DOM中发生的更改应用到其对应的对象,这是Angular的主要用途之一。
考虑这个数组:
users = [ { first_name: "Tim" last_name: "Costa" email: "tjsail33@gmail.com" } ]
如果我们使用ng-repeat =“user in user”将其渲染到列表中,那么其中的每个对象都将从Angular接收用于跟踪目的的$$ hashKey。 这里有两种方法来避免这个$$ hashKey。
这里是如何轻松地从对象中移除$$ hashKey的:
$scope.myNewObject = JSON.parse(angular.toJson($scope.myObject))
$scope.myObject
– 引用你想要执行操作的对象,即从中删除$$ hashKey
$scope.myNewObject
– 将修改的原始对象分配给新对象,以便可以根据需要使用它