$$ hashKey được thêm vào kết quả JSON.opesify của tôi là gì


288

Tôi đã thử tìm kiếm trên trang chuỗi JSON của Mozilla trong các tài liệu của họ cũng như ở đây trên SO và Google nhưng không tìm thấy lời giải thích nào. Tôi đã sử dụng chuỗi ký tự JSOn nhiều lần nhưng không bao giờ gặp kết quả này

Tôi có một mảng các đối tượng 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"
    }
]

được đính kèm với tôi $scopevà để POSTchúng là một tham số, tôi đã sử dụng phương thức JSON.opesify () và tôi nhận được như sau:

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

Tôi chỉ tò mò chính xác hashkey $$ là gì vì tôi mong đợi một cái gì đó tương tự như sau từ phương thức 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"
        }
    }
]

Tôi không chắc đó có phải là yếu tố không nhưng tôi đang sử dụng Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side

Nó không gây ra cho tôi bất kỳ vấn đề nào nhưng tôi muốn biết nguyên nhân và lý do cho $$hashkey


8
nó được thêm bởi angularjs
Arun P Johny



Cảm ơn các bạn, nếu có ai muốn thêm lời giải thích của bạn làm câu trả lời tôi sẽ vui lòng chấp nhận
jonnie

1
Câu trả lời này là một lời giải thích tuyệt vời .. stackoverflow.com/questions/12336897/ Khăn
Charlie Martin

Câu trả lời:


530

Angular thêm điều này để theo dõi các thay đổi của bạn, để nó biết khi nào cần cập nhật DOM.

Nếu bạn sử dụng angular.toJson(obj)thay vì JSON.stringify(obj)sau đó Angular sẽ loại bỏ các giá trị sử dụng nội bộ này cho bạn.

Ngoài ra, nếu bạn thay đổi biểu thức lặp lại của mình để sử dụng track by {uniqueProperty}hậu tố, Angular sẽ không phải thêm $$hashKeyvào. Ví dụ

<ul>
    <li ng-repeat="link in navLinks track by link.href">
        <a ng-href="link.href">{{link.title}}</a>
    </li>
</ul>

Chỉ cần luôn luôn nhớ bạn cần "liên kết." một phần của biểu thức - tôi luôn có xu hướng quên điều đó. Chỉ track by hrefchắc chắn sẽ không hoạt động.


Có bất kỳ bài kiểm tra hiệu suất nào về «theo dõi» so với «$$ hashKey» không? (
CẬP NHẬT

Theo dõi @artuska theo id rất đơn giản vì không cần phải băm, bạn chỉ cần sử dụng lại các id hiện có hoặc tăng số lượt truy cập ...
Barshe Roussy

3
và nếu bạn có bộ lọc để áp dụng, đây là thứ tự đúng : item in somelist | filter:somefilter track by item.key, đừng viết bộ lọc ở cuối dòng!
Lewen

1
Ghi chú! Tôi đã sử dụng một mảng với một phương thức sao chép, sau đó sao chép các phần tử vào một mảng, sau đó được kết xuất lại bằng ng-repeat. Tôi đã nhận được các lỗi 'khóa trùng lặp' góc cạnh khi sử dụng JSON.parse (JSON.opesify (obj)) để sao chép phần tử của tôi. Sử dụng JSON.parse (angular.toJson (obj)); những thứ cố định. Cảm ơn!
SAL

1
Bạn cũng có thể sử dụng tính năng Liên kết một lần bằng cách sử dụng dấu hai chấm :: để ngăn nó cập nhật nếu bạn chỉ hiển thị dữ liệu. <a ng-href="link.href"> {{:: link.title}} </a>
phil

70

Trong trường hợp sử dụng của tôi (cung cấp đối tượng kết quả cho X2JS), cách tiếp cận được đề xuất

data = angular.toJson(source);

giúp loại bỏ các $$hashKeythuộc tính, nhưng kết quả sau đó không thể được X2JS xử lý nữa .

data = angular.copy(source);

cũng loại bỏ các $$hashKeythuộc tính, nhưng kết quả vẫn có thể sử dụng làm tham số cho X2JS.


37

Nó đi kèm với chỉ thị ng-repeat thường. Để thực hiện thao tác dom AngularJS gắn cờ các đối tượng với id đặc biệt.

Điều này là phổ biến với Angular. Ví dụ: nếu bạn nhận được đối tượng với ngResource, đối tượng của bạn sẽ nhúng tất cả API tài nguyên và bạn sẽ thấy các phương thức như $ save, v.v ... Với cookie, AngularJS sẽ thêm thuộc tính __ngDebug.


Làm thế nào tôi nên loại bỏ các tính chất này? Liệu góc có cung cấp bất kỳ cách nào để làm điều đó?
Nilesh

1
Các mô hình góc sẽ phá vỡ nếu bạn cố gắng loại bỏ thuộc tính đó, tôi khuyên bạn nên sao chép biến. Xem câu trả lời của @ David-Boike về cách lọc hashkey
Josue Alexander Ibarra

23

Nếu bạn không muốn thêm id vào dữ liệu của mình, bạn có thể theo dõi chỉ mục trong mảng, điều này sẽ khiến các mục bị khóa bởi vị trí của chúng trong mảng thay vì giá trị của chúng.

Như thế này:

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

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

Điều đó đòi hỏi giả định rằng thứ tự của các mặt hàng của bạn sẽ không bao giờ thay đổi. :)
mã hóa

8

Nếu bạn đang sử dụng Angular 1.3 trở lên, tôi khuyên bạn nên sử dụng "theo dõi" trong lần lặp lại của mình. Angular không thêm thuộc tính "$$ hashKey" vào các đối tượng trong mảng của bạn nếu bạn sử dụng "track by". Bạn cũng nhận được lợi ích về hiệu suất, nếu có gì đó trong mảng của bạn thay đổi, angular không tạo lại toàn bộ cấu trúc DOM cho lặp lại ng của bạn, thay vào đó, nó sẽ tạo lại một phần của DOM cho các giá trị trong mảng đã thay đổi.


4

Cập nhật: Từ Angular v1.5, theo dõi $indexbây giờ là cú pháp tiêu chuẩn thay vì sử dụng liên kết vì nó gây ra lỗi cho tôi ng-repeat.

Tôi chạy vào đây cho một cái lồng ng-repeatvà bên dưới làm việc.

<tbody>
    <tr ng-repeat="row in data track by $index">
    <td ng-repeat="field in headers track by $index">{{row[field.caption] }}</td>
</tr>

Chỉ cần làm rõ - thuộc tính được sử dụng trong theo dõi bằng biểu thức phải là duy nhất trên bộ sưu tập lặp đi lặp lại. $ index là một lựa chọn. Trong hầu hết các trường hợp là đủ, nhưng đôi khi bạn có thể thấy hữu ích để theo dõi theo thuộc tính duy nhất. (Id, ...)
Martin Hlavňa

Điều đó đòi hỏi giả định rằng thứ tự của các mặt hàng của bạn sẽ không bao giờ thay đổi. :)
mã hóa

3

Đây là cách bạn có thể dễ dàng xóa $$ hashKey khỏi đối tượng:

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

$scope.myObject - Đề cập đến Đối tượng mà bạn muốn thực hiện thao tác tức là xóa $$ hashKey khỏi

$scope.myNewObject - Gán đối tượng gốc đã sửa đổi cho đối tượng mới để có thể sử dụng nó khi cần thiết


Tôi thấy điều này phức tạp không cần thiết. Bạn chỉ có thể xóa trường đó - hoặc mọi trường bắt đầu bằng $. Nhưng có lẽ bạn không cần phải - xem các câu trả lời khác.
Sevcsik

1

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

Angular khá kỳ diệu khi lần đầu tiên mọi người nhìn thấy nó. Tự động cập nhật DOM khi bạn cập nhật một biến trong JS của bạn và cùng một biến sẽ cập nhật trong tệp JS của bạn khi ai đó cập nhật giá trị của nó trong DOM. Chức năng tương tự này hoạt động trên các thành phần trang và trên các bộ điều khiển.

Chìa khóa cho tất cả điều này là $$ hashKey Angular gắn vào các đối tượng và mảng được sử dụng trong ng-repeats.

$$ hashKey này gây ra nhiều nhầm lẫn cho những người đang gửi các đối tượng đầy đủ đến một API không tước dữ liệu bổ sung. API sẽ trả về 400 cho tất cả các yêu cầu của bạn, nhưng $$ hashKey đó sẽ không biến mất khỏi các đối tượng của bạn.

Angular sử dụng hàm băm $$ để theo dõi các phần tử nào trong DOM thuộc về mục nào trong một mảng đang được lặp lại trong một lần lặp lại. Nếu không có $$ hashKey Angular sẽ không có cách nào để áp dụng các thay đổi xảy ra trong JavaScript hoặc DOM cho đối tác của họ, đây là một trong những cách sử dụng chính cho Angular.

Hãy xem xét mảng này:

users = [  
    {
         first_name: "Tim"
         last_name: "Costa"
         email: "tjsail33@gmail.com"
    }
]

Nếu chúng tôi kết xuất nó vào một danh sách bằng ng-repeat = "user in users", mỗi đối tượng trong đó sẽ nhận được một hashKey $$ cho mục đích theo dõi từ Angular. Dưới đây là hai cách để tránh $$ hashKey này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.