私は彼らのドキュメントの 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
に添付されていて、それらを1つのパラメータとして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
の原因と原因を知りたいのですが
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は特別なIDでオブジェクトにフラグを立てます。
これはAngularと共通です。たとえば、ngResourceを使ってオブジェクトを取得すると、そのオブジェクトにはすべてのリソースAPIが埋め込まれ、$ saveなどのメソッドが表示されます。クッキーを使用するとAngularJSはプロパティ__ngDebugを追加します。
データにIDを追加したくない場合は、配列内のインデックスで追跡することができます。これにより、アイテムは値ではなく配列内の位置によってキー入力されます。
このような:
var myArray = [1,1,1,1,1];
<li ng-repeat="item in myArray track by $index">
Angular 1.3以上を使用している場合は、ng-repeatで "track by"を使用することをお勧めします。 "track by"を使用した場合、Angularは配列内のオブジェクトに "$$ hashKey"プロパティを追加しません。また、配列内の何かが変更されても、Angularがng-repeatのDOM構造全体を再作成するのではなく、変更された配列内の値に対してDOMの一部を再作成するというパフォーマンス上の利点もあります。
更新:Angular v1.5から、$index
による重複エラーが発生したため、linkを使用する代わりに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
- 操作を実行したいオブジェクトを参照します。例:
$scope.myNewObject
- 修正された元のオブジェクトを新しいオブジェクトに割り当て、必要に応じて使用できるようにする
https://www.timcosta.io/angular-js-object-comparisons/
Angularは、初めて見る人にとっては非常に不思議なものです。 JSで変数を更新すると自動的にDOMが更新され、誰かがDOMでその値を更新すると同じ変数がJSファイルでも更新されます。これと同じ機能が、ページ要素間およびコントローラ間で機能します。
これらすべての鍵は、ng-repeatsで使用されるオブジェクトと配列への$$ hashKey Angularアタッチです。
この$$ hashKeyは、余分なデータを削除しないAPIに完全なオブジェクトを送信している人々にとって、多くの混乱を招きます。 APIはあなたのすべてのリクエストに対して400を返しますが、その$$ hashKeyはあなたのオブジェクトから消えてはいけません。
Angularは、ng-repeatでループされている配列のどの項目にDOMのどの要素が属しているかを追跡するために$$ hashKeyを使用します。 $$ hashKeyがなければ、AngularはJavaScriptやDOMで発生した変更を対応するものに適用することができません。これはAngularの主な用途のひとつです。
この配列を考えます:
users = [
{
first_name: "Tim"
last_name: "Costa"
email: "[email protected]"
}
]
Ng-repeat = "user in users"を使用してそれをリストにレンダリングした場合、その中の各オブジェクトはAngularからトラッキング目的で$$ hashKeyを受け取ります。これを回避する2つの方法があります。