Что такое $$ hashKey, добавленный к моему результату JSON.stringify

Я пробовал посмотреть страницу Mozilla JSON в своих документах, а также здесь, в SO и Google, но не нашел объяснений. Я использовал 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, и для 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

Ответ 1

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, безусловно, не будет работать.

Ответ 2

В моем случае использования (подача результирующего объекта на X2JS) рекомендуемый подход

data = angular.toJson(source);

Помогите удалить свойства $$hashKey, но результат может быть больше не обработан X2JS.

data = angular.copy(source);

удалены также свойства $$hashKey, но результат остается полезным в качестве параметра для X2JS.

Ответ 3

Он обычно поставляется с директивой ng-repeat. Чтобы выполнить манипуляции с dom, объекты AngularJS с специальным идентификатором.

Это относится к Angular. Например, если u получить объект с ngResource, ваш объект будет внедрять весь API ресурсов, и вы увидите такие методы, как $save и т.д. С помощью файлов cookie тоже AngularJS добавит свойство __ngDebug.

Ответ 4

Если вы не хотите добавлять id к своим данным, вы можете отслеживать по индексу в массиве, что приведет к тому, что элементы будут забиты положением в массиве вместо их значения.

Вот так:

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

<li ng-repeat="item in myArray track by $index">

Ответ 5

Если вы используете Angular 1.3 или выше, я рекомендую вам использовать "track by" в вашем ng-repeat. Angular не добавляет свойство "$$ hashKey" к объектам в вашем массиве, если вы используете "track by". Вы также получаете преимущества в производительности, если что-то в вашем массиве изменяется, Angular не воссоздает всю структуру DOM для вашего ng-repeat, вместо этого воссоздает часть DOM для значений в вашем массиве, которые изменились.

Ответ 6

Обновление: от 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>

Ответ 7

https://www.timcosta.io/angular-js-object-comparisons/

Angular довольно волшебный, когда люди впервые его видят. Автоматические обновления DOM при обновлении переменной в JS, и одна и та же переменная будет обновляться в вашем JS файле, когда кто-то обновит его значение в DOM. Эта же функциональность работает со всеми элементами страницы и между контроллерами.

Ключом ко всему этому является $$ hashKey Angular прикрепляется к объектам и массивам, используемым в ng-повторах.

Этот $$ 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", каждый объект в нем получит $$ hashKey для целей отслеживания с Angular. Вот два способа избежать этого $$ hashKey.

Ответ 8

Вот как вы можете легко удалить $$ hashKey из объекта:

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

$scope.myObject - указывает на объект, который вы хотите выполнить, например, удалите $$ hashKey из

$scope.myNewObject - назначить модифицированный исходный объект новому объекту, чтобы его можно было использовать по мере необходимости