Я пробовал посмотреть страницу 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
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
, безусловно, не будет работать.
В моем случае использования (подача результирующего объекта на X2JS) рекомендуемый подход
data = angular.toJson(source);
Помогите удалить свойства $$hashKey
, но результат может быть больше не обработан X2JS.
data = angular.copy(source);
удалены также свойства $$hashKey
, но результат остается полезным в качестве параметра для X2JS.
Он обычно поставляется с директивой ng-repeat. Чтобы выполнить манипуляции с dom, объекты AngularJS с специальным идентификатором.
Это относится к Angular. Например, если u получить объект с ngResource, ваш объект будет внедрять весь API ресурсов, и вы увидите такие методы, как $save и т.д. С помощью файлов cookie тоже AngularJS добавит свойство __ngDebug.
Если вы не хотите добавлять id к своим данным, вы можете отслеживать по индексу в массиве, что приведет к тому, что элементы будут забиты положением в массиве вместо их значения.
Вот так:
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 для значений в вашем массиве, которые изменились.
Обновление: от 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>
Вот как вы можете легко удалить $$ hashKey из объекта:
$scope.myNewObject = JSON.parse(angular.toJson($scope.myObject))
$scope.myObject
- указывает на объект, который вы хотите выполнить, например, удалите $$ hashKey из
$scope.myNewObject
- назначить модифицированный исходный объект новому объекту, чтобы его можно было использовать по мере необходимости
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.