Я попытался просмотреть страницу их документов в Mozilla JSON, а также здесь, в 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"
}
]
Мне просто любопытно, что именно является хеш-ключом $$, так как я ожидал чего-то более похожего на следующее из метода 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
javascript
jquery
json
angularjs
Jonnie
источник
источник
Ответы:
Angular добавляет это, чтобы отслеживать ваши изменения, поэтому он знает, когда ему нужно обновить DOM.
Если вы используете
angular.toJson(obj)
вместо,JSON.stringify(obj)
то Angular удалит эти значения для внутреннего использования.Кроме того, если вы измените свое выражение повторения на
track by {uniqueProperty}
суффикс, Angular не нужно будет добавлять$$hashKey
вообще. НапримерПросто всегда помните, что вам нужна "ссылка". часть выражения - я всегда склонен забывать это. Просто
track by href
точно не сработает.источник
item in somelist | filter:somefilter track by item.key
не пишите фильтр в конце строки!В моем случае использования (передача полученного объекта в X2JS) рекомендуемый подход
помогите удалить
$$hashKey
свойства, но результат больше не может быть обработан X2JS .также удалил
$$hashKey
свойства, но результат остался пригодным для использования в качестве параметра для X2JS.источник
Обычно он поставляется с директивой ng-repeat. Для манипулирования домом AngularJS помечает объекты со специальным идентификатором.
Это общее с Angular. Например, если вы получите объект с помощью ngResource, ваш объект будет встраивать все API ресурсов, и вы увидите такие методы, как $ save и т. Д. Также и с файлами cookie AngularJS добавит свойство __ngDebug.
источник
Если вы не хотите добавлять идентификаторы в свои данные, вы можете отслеживать по индексу в массиве, что приведет к тому, что элементы будут обозначены позицией в массиве, а не их значением.
Как это:
источник
Если вы используете Angular 1.3 или выше, я рекомендую использовать «track by» в вашем ng-repeat. Angular не добавляет свойство $$ hashKey к объектам в вашем массиве, если вы используете «track by». Вы также получаете выигрыш в производительности, если что-то в вашем массиве изменяется, angular не воссоздает всю структуру DOM для вашего ng-repeat, вместо этого он воссоздает часть DOM для значений в вашем массиве, которые изменились.
источник
Обновление: Начиная с Angular v1.5, отслеживание по
$index
теперь является стандартным синтаксисом, а не использованием ссылки, поскольку это дало мнеng-repeat
ошибку dupes.Я столкнулся с этим для вложенного
ng-repeat
и ниже работал.источник
Вот как вы можете легко удалить $$ hashKey из объекта:
$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.
Рассмотрим этот массив:
Если мы отобразим это в список, используя ng-repeat = "user in users", каждый объект в нем получит $$ hashKey для отслеживания в Angular. Вот два способа избежать этого $$ hashKey.
источник