我尝试查看其文档的 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
方法中的内容与以下内容更相似(即没有 $$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"
}
}
]
我不确定这是否是一个因素,但我正在使用以下内容:
我还在服务器端使用 Spring security 3.0.7。
这不会给我带来任何问题,但我想知道
$$hashkey
的原因和原因
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
肯定不行。
在我的用例中(将生成的对象提供给 X2JS)推荐的方法
data = angular.toJson(source);
帮助删除
$$hashKey
属性,但结果将无法再由 X2JS 处理。
data = angular.copy(source);
也删除了
$$hashKey
属性,但结果仍然可用作 X2JS 的参数。
它通常带有 ng-repeat 指令。为了进行 dom 操作,AngularJS 用特殊的 id 标记对象。
这在 Angular 中很常见。例如,如果你使用 ngResource 获取对象,你的对象将嵌入所有资源 API,并且你将看到 $save 等方法。对于 cookies,AngularJS 也会添加一个属性 __ngDebug。
如果您不想将 id 添加到数据中,您可以通过数组中的索引进行跟踪,这将导致项目通过其在数组中的位置而不是其值进行键控。
像这样:
var myArray = [1,1,1,1,1];
<li ng-repeat="item in myArray track by $index">
如果您使用 Angular 1.3 或更高版本,我建议您在 ng-repeat 中使用“track by”。如果您使用“track by”,Angular 不会向数组中的对象添加“$$hashKey”属性。您还可以获得性能优势,如果数组中的某些内容发生变化,Angular 不会为您的 ng-repeat 重新创建整个 DOM 结构,而是为数组中已更改的值重新创建 DOM 部分。
更新:从 Angular v1.5 开始,由
$index
跟踪现在是标准语法,而不是使用链接,因为它给了我一个 ng-repeat
欺骗错误。
我遇到了这个嵌套的
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>
以下是如何轻松从对象中删除 $$hashKey 的方法:
$scope.myNewObject = JSON.parse(angular.toJson($scope.myObject))
$scope.myObject
- 指的是您要执行操作的对象,即从中删除 $$hashKey
$scope.myNewObject
- 将修改后的原始对象分配给新对象,以便可以根据需要使用它
https://www.timcosta.io/angular-js-object-comparisons/
当人们第一次看到 Angular 时,它非常神奇。当您更新 JS 中的变量时,DOM 会自动更新,并且当有人更新 DOM 中的值时,同一变量也会在 JS 文件中更新。同样的功能可以跨页面元素和控制器工作。
这一切的关键是 Angular 附加到 ng-repeats 中使用的对象和数组的 $$hashKey。
这个 $$hashKey 会给那些将完整对象发送到不剥离额外数据的 API 的人带来很多困惑。 API 将为您的所有请求返回 400,但是 $$hashKey 不会从您的对象中消失。
Angular 使用 $$hashKey 来跟踪 DOM 中的哪些元素属于在 ng-repeat 中循环的数组中的哪个项目。如果没有 $$hashKey,Angular 将无法将 JavaScript 或 DOM 中发生的更改应用到其对应项,这是 Angular 的主要用途之一。
考虑这个数组:
users = [ { first_name: "Tim" last_name: "Costa" email: "[email protected]" } ]
如果我们使用 ng-repeat="user in users" 将其渲染到列表中,则其中的每个对象都会从 Angular 接收一个 $$hashKey 用于跟踪目的。这里有两种方法可以避免这个$$hashKey。