web-dev-qa-db-ja.com

私のJSON.stringifyの結果に追加された$$ hashKeyとは何ですか

私は彼らのドキュメントの 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の原因と原因を知りたいのですが

274
jonnie

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だけでは確実に機能しません。

515
David Boike

私のユースケースでは(結果のオブジェクトをX2JSにフィードする)推奨されるアプローチ

data = angular.toJson(source);

$$hashKeyプロパティを削除することはできますが、結果は X2JS で処理できなくなります。

data = angular.copy(source);

$$hashKeyプロパティも削除しましたが、結果はX2JSのパラメータとして使用可能なままでした。

69
RobE

通常はng-repeatディレクティブが付属しています。 DOM操作をするためにAngularJSは特別なIDでオブジェクトにフラグを立てます。

これはAngularと共通です。たとえば、ngResourceを使ってオブジェクトを取得すると、そのオブジェクトにはすべてのリソースAPIが埋め込まれ、$ saveなどのメソッドが表示されます。クッキーを使用するとAngularJSはプロパティ__ngDebugを追加します。

37
Thomas Pons

データに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の一部を再作成するというパフォーマンス上の利点もあります。

8
Ajay Ullal

更新: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>
4
Vinay

オブジェクトから$$ hashKeyを簡単に削除する方法は次のとおりです。

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

$scope.myObject - 操作を実行したいオブジェクトを参照します。例:

$scope.myNewObject - 修正された元のオブジェクトを新しいオブジェクトに割り当て、必要に応じて使用できるようにする

1
Devner

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つの方法があります。

1
alfishan aqeel