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

238

Я пробовал посмотреть страницу 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

  • 8
    добавлено angularjs
  • 1
    groups.google.com/forum/#!topic/angular/pI0IgNHKjxw
Показать ещё 3 комментария

8 ответов

441
Лучший ответ

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

  • 0
    Есть ли тесты производительности по «track by» против «$$ hashKey»? (UPD. Хорошо, я прогуглил это, и «отслеживание» является более предпочтительным)
  • 0
    Отслеживание @artuska по идентификатору очень просто, так как не нужно вычислять хэши, вы просто повторно используете существующие идентификаторы или увеличиваете счетчик ...
Показать ещё 5 комментариев
60

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

data = angular.toJson(source);

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

data = angular.copy(source);

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

34

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

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

  • 0
    как я должен удалить эти свойства? Angular предоставляет какой-либо способ сделать это?
  • 1
    Угловые модели сломаются, если вы попытаетесь удалить это свойство, я рекомендую скопировать переменную. Смотрите ответ @ David-Boike о том, как отфильтровать хэш-ключ
22

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

Вот так:

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

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

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

3

Обновление: от 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>
  • 0
    Просто чтобы уточнить - атрибут, используемый в отслеживании по выражению, должен быть уникальным во всей повторяющейся коллекции. $ index является одним из вариантов. В большинстве случаев этого достаточно, но иногда может оказаться полезным отслеживать по уникальному атрибуту. (Id, ...)
1

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

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

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

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

  • 0
    Я нахожу это излишне сложным. Вы можете просто удалить это единственное поле - или каждое поле, начинающееся с $. Но, вероятно, вам не нужно - смотрите другие ответы.
1

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню