$$ hashKey คืออะไรเพิ่มใน JSON.stringify ของฉัน


289

ฉันได้ลองดูที่หน้าสตริง Mozilla Mozilla JSONของ docs ของพวกเขาเช่นเดียวกับที่นี่ใน 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"
        }
    ]

ฉันแค่อยากรู้ว่า 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


8
มันถูกเพิ่มโดย angularjs
Arun P Johny


69
แทน JSON.stringify ใช้angular.toJson ()
อรุณ P Johny

Guys ขอบคุณถ้าคนใดคนหนึ่งต้องการที่จะเพิ่มคำอธิบายของคุณเป็นคำตอบที่ฉันจะมีความสุขที่จะยอมรับ
Jonnie

1
คำตอบนี้เป็นคำอธิบายที่ยอดเยี่ยม .. stackoverflow.com/questions/12336897/…
Charlie Martin

คำตอบ:


531

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จะไม่ทำงาน


มีการทดสอบประสิทธิภาพใด ๆ เกี่ยวกับ«ติดตามโดย» vs « $$ hashKey »หรือไม่ (UPD ตกลงฉันได้ googled มันและ«ติดตามโดย»คือ preferrable เพิ่มเติม.)
artuska

@artuska การติดตามโดย id นั้นตรงไปตรงมามากโดยไม่ต้องคำนวณ hashes คุณเพียงแค่นำรหัสที่มีอยู่มาใช้ใหม่หรือเพิ่มเคาน์เตอร์ ...
Christophe Roussy

3
และถ้าคุณมีตัวกรองที่จะใช้นี่คือคำสั่งที่ถูกต้อง: item in somelist | filter:somefilter track by item.keyอย่าเขียนตัวกรองที่ท้ายบรรทัด!
Lewen

1
บันทึก! ฉันใช้อาเรย์กับวิธีการโคลนซึ่งก็อปปี้องค์ประกอบที่ใส่เข้าไปในอาเรย์แล้วก็ทำซ้ำโดย ng-repeat ฉันได้รับข้อผิดพลาด 'คีย์ซ้ำ' เมื่อใช้ JSON.parse (JSON.stringify (obj)) เพื่อโคลนองค์ประกอบของฉัน ใช้ JSON.parse (angular.toJson (obj)); สิ่งที่คงที่ ขอบคุณ!
SAL

1
คุณยังสามารถใช้คุณสมบัติการผูกครั้งเดียวโดยใช้เครื่องหมายจุดคู่คู่ :: เพื่อป้องกันไม่ให้อัปเดตหากคุณแสดงข้อมูลเท่านั้น <a ng-href="link.href"> {{:: link.title}} </a>
phil

70

ในกรณีการใช้งานของฉัน (ป้อนวัตถุที่เป็นผลลัพธ์ให้กับ X2JS) แนวทางที่แนะนำ

data = angular.toJson(source);

ความช่วยเหลือที่จะเอา$$hashKeyคุณสมบัติ แต่ผลที่ได้สามารถแล้วไม่ได้รับการประมวลผลโดยX2JS

data = angular.copy(source);

ลบ$$hashKeyคุณสมบัติเช่นกัน แต่ผลลัพธ์ยังคงใช้งานได้เป็นพารามิเตอร์สำหรับ X2JS


37

มันมาพร้อมกับคำสั่ง ng-repeat โดยปกติ ในการทำการจัดการ dom AngularJS แฟล็กอ็อบเจ็กต์ด้วย id พิเศษ

นี่เป็นเรื่องปกติของแองกูลาร์ ตัวอย่างเช่นหากคุณได้รับวัตถุด้วย ngResource วัตถุของคุณจะฝัง API ทรัพยากรทั้งหมดและคุณจะเห็นวิธีการเช่น $ save ฯลฯ ด้วยคุกกี้ AngularJS จะเพิ่มคุณสมบัติ __ngDebug


ฉันจะลบคุณสมบัติเหล่านี้ได้อย่างไร เชิงมุมมีวิธีใดบ้างในการทำเช่นนั้น?
Nilesh

1
แบบจำลองเชิงมุมจะแตกหากคุณพยายามลบคุณสมบัตินั้นฉันแนะนำให้คัดลอกตัวแปร ดูคำตอบของ @ David-Boike เกี่ยวกับวิธีกรองแฮชคีย์
Josue Alexander Ibarra

23

หากคุณไม่ต้องการเพิ่มรหัสลงในข้อมูลของคุณคุณสามารถติดตามโดยดัชนีในอาเรย์ซึ่งจะทำให้รายการนั้นถูกคีย์โดยตำแหน่งของพวกเขาในอาเรย์แทนที่จะเป็นค่าของพวกเขา

แบบนี้:

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

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

ต้องมีการสมมติว่าลำดับของรายการของคุณจะไม่เปลี่ยนแปลง :)
เรียบร้อยแล้ว

8

หากคุณใช้ Angular 1.3 หรือสูงกว่าฉันแนะนำให้คุณใช้ "track by" ใน ng-repeat ของคุณ Angular ไม่ได้เพิ่มคุณสมบัติ "$$ hashKey" ให้กับวัตถุในอาร์เรย์ของคุณหากคุณใช้ "track by" นอกจากนี้คุณยังจะได้รับประโยชน์ด้านประสิทธิภาพหากมีบางอย่างในอาเรย์ของคุณเปลี่ยนแปลงแองกูลาร์ไม่ได้สร้างโครงสร้าง DOM ทั้งหมดสำหรับการทำซ้ำเอ็นจีจีของคุณมันจะสร้างส่วนของ DOM ใหม่สำหรับค่าในอาเรย์ที่เปลี่ยนไป


4

อัปเดต: จาก 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>

เพื่อชี้แจง - แอตทริบิวต์ที่ใช้ในการติดตามโดยนิพจน์จะต้องไม่ซ้ำกันในคอลเลกชันซ้ำ $ index เป็นตัวเลือกหนึ่ง ในกรณีส่วนใหญ่ก็เพียงพอแล้ว แต่บางครั้งคุณอาจพบว่ามีประโยชน์ในการติดตามโดยแอตทริบิวต์ที่ไม่ซ้ำกัน (id, ... )
Martin Hlavňa

ต้องมีการสมมติว่าลำดับของรายการของคุณจะไม่เปลี่ยนแปลง :)
เรียบร้อยแล้ว

3

นี่คือวิธีที่คุณสามารถลบ $$ hashKey ออกจากวัตถุได้อย่างง่ายดาย:

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

$scope.myObject - อ้างถึงอ็อบเจกต์ที่คุณต้องการดำเนินการเช่นลบ $$ hashKey ออก

$scope.myNewObject - กำหนดวัตถุต้นฉบับที่แก้ไขแล้วไปยังวัตถุใหม่เพื่อให้สามารถใช้ตามความจำเป็น


ฉันพบว่ามันซับซ้อนโดยไม่จำเป็น คุณสามารถลบฟิลด์เดียว - หรือทุกฟิลด์ที่เริ่มต้นด้วย $ แต่บางทีคุณไม่จำเป็นต้องดูคำตอบอื่น
sevcsik

1

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

แองกูลาร์เป็นคนน่าอัศจรรย์ในครั้งแรกที่มีคนเห็น การอัปเดตอัตโนมัติ DOM เมื่อคุณอัปเดตตัวแปรใน JS ของคุณและตัวแปรเดียวกันจะอัปเดตในไฟล์ JS ของคุณเมื่อมีคนอัปเดตค่าใน DOM ฟังก์ชั่นเดียวกันนี้ใช้งานได้กับองค์ประกอบหน้าและตัวควบคุม

กุญแจสำคัญในการทั้งหมดนี้คือ $$ hashKey Angular ยึดติดกับวัตถุและอาร์เรย์ที่ใช้ใน ng-repeats

$$ hashKey นี้ทำให้เกิดความสับสนอย่างมากสำหรับผู้ที่กำลังส่งออบเจ็กต์แบบเต็มไปยัง API ที่ไม่ได้ดึงข้อมูลเพิ่มเติม API จะส่งคืน 400 สำหรับคำขอทั้งหมดของคุณ แต่ $$ hashKey จะไม่หายไปจากวัตถุของคุณ

Angular ใช้ $$ hashKey เพื่อติดตามว่าองค์ประกอบใดใน DOM เป็นของรายการใดในอาเรย์ที่ถูกวนซ้ำใน ng-repeat หากไม่มี $$ hashKey Angular จะไม่มีทางที่จะใช้การเปลี่ยนแปลงที่เกิดขึ้นใน JavaScript หรือ DOM กับคู่ของพวกเขาซึ่งเป็นหนึ่งในการใช้หลักสำหรับ Angular

พิจารณาอาร์เรย์นี้:

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

หากเราแสดงว่าลงในรายการโดยใช้ ng-repeat = "ผู้ใช้ในผู้ใช้" แต่ละวัตถุในนั้นจะได้รับ $$ hashKey สำหรับวัตถุประสงค์ในการติดตามจาก Angular นี่คือสองวิธีในการหลีกเลี่ยงการ $ hashKey นี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.