什么是添加到我的JSON.stringify结果的$$ hashKey

jon*_*nie 281 javascript jquery json angularjs

我已经尝试查看他们的文档的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"
    }
]
Run Code Online (Sandbox Code Playgroud)

附加到我$scopePOST他们作为一个参数我使用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"
        }
    ]
Run Code Online (Sandbox Code Playgroud)

我很好奇究竟是什么是$$ 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"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

我不确定它是否是一个因素,但我正在使用 Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side

它不会引起任何问题,但我想知道原因和原因 $$hashkey

Dav*_*ike 525

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>
Run Code Online (Sandbox Code Playgroud)

只记得你需要"链接".表达的一部分 - 我总是倾向于忘记这一点.只是track by href肯定不会工作.

  • 如果你有一个要应用的过滤器,这里是正确的顺序:`somelist中的项目| filter:somefilter track by item.key`,不要在行尾写入过滤器! (3认同)

rob*_*rse 70

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

data = angular.toJson(source);
Run Code Online (Sandbox Code Playgroud)

有助于删除$$hashKey属性,但X2JS不再处理结果.

data = angular.copy(source);
Run Code Online (Sandbox Code Playgroud)

同时删除了$$hashKey属性,但结果仍可用作X2JS的参数.


Tho*_*ons 37

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

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


Mic*_*ård 23

如果您不想将id添加到数据中,则可以按数组中的索引进行跟踪,这将导致项目在数组中的位置而不是其值中键入.

像这样:

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

<li ng-repeat="item in myArray track by $index">
Run Code Online (Sandbox Code Playgroud)


Aja*_*lal 8

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