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



Я попытался посмотреть на странице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:



[
{
"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

636   8  

8 ответов:

Angular добавляет Это, чтобы отслеживать Ваши изменения, поэтому он знает, когда ему нужно обновить DOM.

Если вы используете angular.toJson(obj) вместо JSON.stringify(obj), то Angular лишит вас этих значений внутреннего использования.

Кроме того, если вы измените выражение repeat на использование суффикса 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. Делать манипуляции в AngularJS объектов флагов дом со специальным кодом.

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

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

Вот так:

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

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

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

Update: начиная с Angular v1. 5, track by $index теперь является стандартным синтаксисом вместо использования link, поскольку он дал мне ошибку ng-repeat dupes.

Я столкнулся с этим для вложенного 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>

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

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

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

Это $$hashKey вызывает много путаницы у людей, которые отправляют полные объекты в API, который не удаляет лишние данные. API вернет 400 для всех ваших запросов, но этот $$hashKey просто не уйдет от ваших объектов.

Angular использует хэш-ключ$$, чтобы отслеживать, какие элементы в 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.

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

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

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

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

Comments

    Ничего не найдено.