297

我曾尝试查看他们文档的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"
        }
    }
]

我不确定这是否是一个因素,但我正在使用以下内容:

  • Angularjs 1.1.5,
  • jQuery 1.8.2
  • 春天 3.0.4

我还在服务器端使用 Spring security 3.0.7。

它没有给我带来任何问题,但我想知道原因和原因$$hashkey

4

8 回答 8

547

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肯定行不通。

于 2014-05-14T14:02:20.087 回答
72

在我的用例中(将结果对象提供给 X2JS)推荐的方法

data = angular.toJson(source);

帮助删除$$hashKey属性,但结果可能不再由X2JS处理。

data = angular.copy(source);

也删除了$$hashKey属性,但结果仍然可以用作 X2JS 的参数。

于 2014-08-27T17:22:17.417 回答
37

它通常带有 ng-repeat 指令。要进行 dom 操作,AngularJS 会标记具有特殊 id 的对象。

这在 Angular 中很常见。例如,如果您使用 ngResource 获取对象,您的对象将嵌入所有资源 API,您将看到 $save 等方法。使用 cookie AngularJS 也会添加属性 __ngDebug。

于 2013-09-16T12:50:26.847 回答
24

如果您不想将 id 添加到数据中,则可以通过数组中的索引进行跟踪,这将导致项目以它们在数组中的位置而不是它们的值作为键。

像这样:

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

<li ng-repeat="item in myArray track by $index">
于 2014-06-11T05:48:28.870 回答
8

如果您使用的是 Angular 1.3 或更高版本,我建议您在 ng-repeat 中使用“track by”。如果您使用“track by”,Angular 不会向数组中的对象添加“$$hashKey”属性。您还可以获得性能优势,如果您的数组中的某些内容发生更改,angular 不会为您的 ng-repeat 重新创建整个 DOM 结构,而是为您的数组中已更改的值重新创建 DOM 的一部分。

于 2015-10-23T06:31:16.107 回答
4

更新:从 Angular v1.5 开始,track by$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>
于 2015-10-13T15:45:49.890 回答
4

以下是您可以轻松地从对象中删除 $$hashKey 的方法:

$scope.myNewObject = JSON.parse(angular.toJson($scope.myObject))

$scope.myObject- 指您要对其执行操作的对象,即从中删除 $$hashKey

$scope.myNewObject- 将修改后的原始对象分配给新对象,以便在需要时使用

于 2017-03-04T01:21:51.677 回答
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"
    }
]

如果我们使用 ng-repeat="user in users" 将其渲染到一个列表中,其中的每个对象都会收到一个 $$hashKey 用于来自 Angular 的跟踪目的。这里有两种方法可以避免这个 $$hashKey。

于 2016-12-30T12:08:59.457 回答