$ $ HashKey मेरे JSON.stringify परिणाम में क्या जोड़ा गया है


289

मैंने अपने डॉक्स के मोज़िला जोंस स्ट्रिंग पेज के साथ-साथ SO और Google पर भी देखने की कोशिश की है, लेकिन कोई स्पष्टीकरण नहीं मिला। मैंने JSOn का उपयोग कई बार कठोर किया है, लेकिन इस परिणाम पर कभी नहीं आया

मेरे पास 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"
        }
    ]

मैं बस उत्सुक हूं कि वास्तव में $ $ हैशकी क्या है क्योंकि मुझे स्ट्रिंग विधि से निम्नलिखित के समान कुछ और की उम्मीद थी:

[
    {
        "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 द्वारा जोड़ा गया है
अरुण पी जॉनी


69
बजाय JSON.stringify उपयोग कोणीय.toJson ()
अरुण पी जॉनी

धन्यवाद दोस्तों, अगर कोई भी आपके स्पष्टीकरण को एक जवाब के रूप में जोड़ना चाहता है तो मुझे यह स्वीकार करने में खुशी होगी
जॉनी

1
यह जवाब एक महान विवरण है .. stackoverflow.com/questions/12336897/…
चार्ली मार्टिन

जवाबों:


531

कोणीय अपने परिवर्तनों का ट्रैक रखने के लिए इसे जोड़ता है, इसलिए यह जानता है कि कब डोम को अपडेट करना है।

यदि आप angular.toJson(obj)इसके बजाय उपयोग करते हैं JSON.stringify(obj)तो कोणीय आपके लिए इन आंतरिक-उपयोग मूल्यों को छीन लेगा।

यदि आप track by {uniqueProperty}प्रत्यय का उपयोग करने के लिए अपनी दोहराने की अभिव्यक्ति को बदलते हैं, तो कोणीय को बिल्कुल जोड़ना नहीं होगा $$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निश्चित रूप से काम नहीं करेगा।


क्या किसी भी प्रदर्शन परीक्षण के बारे में «ट्रैक द्वारा» बनाम «$ $ हैशके»? (UPD। ठीक है, मैं इसे googled है और «ट्रैक द्वारा» और अधिक बेहतर है)
Artuska

आईडी द्वारा @artuska ट्रैकिंग बहुत सीधी है क्योंकि किसी भी हैश की गणना करने के लिए आपको सिर्फ मौजूदा आईडी का पुन: उपयोग नहीं करना है या एक काउंटर बढ़ाना है ...
Christophe Roussy

3
और यदि आपके पास आवेदन करने के लिए एक फ़िल्टर है, तो यहां सही क्रम है: item in somelist | filter:somefilter track by item.keyलाइन के अंत में फ़िल्टर न लिखें!
लेवेन

1
ध्यान दें! मैं एक क्लोन विधि के साथ एक सरणी का उपयोग कर रहा था, जो तब कॉपी किए गए तत्वों को एक सरणी में सम्मिलित करता था, जिसे फिर एनजी-रिपीट द्वारा प्रस्तुत किया गया था। अपने तत्व को क्लोन करने के लिए JSON.parse (JSON.stringify (obj)) का उपयोग करते समय मुझे कोणीय 'डुप्लिकेट कुंजी' त्रुटियाँ मिल रही थीं। JSON.parse (angular.toJson (obj)) का उपयोग करना; तय बातें। धन्यवाद!
SAL

1
यदि आप केवल डेटा प्रदर्शित कर रहे हैं, तो इसे अपडेट करने से रोकने के लिए, आप डबल कोलन :: का उपयोग करके वन टाइम बाइंडिंग सुविधा का उपयोग कर सकते हैं। <a ng-href="link.href"> {{:: link.title}} </a> </a>
फिल

70

मेरे उपयोग के मामले में (एक्स 2 जेएस को परिणामी वस्तु खिलाते हुए) अनुशंसित दृष्टिकोण

data = angular.toJson(source);

$$hashKeyसंपत्तियों को हटाने में मदद करें , लेकिन परिणाम अब X2JS द्वारा संसाधित नहीं किया जा सकता है ।

data = angular.copy(source);

$$hashKeyगुणों को भी हटा दिया , लेकिन परिणाम X2JS के लिए एक पैरामीटर के रूप में प्रयोग करने योग्य रहा।


37

यह एनजी-दोहराने के निर्देश के साथ आता है। डोम हेरफेर करने के लिए AngularJS विशेष आईडी के साथ वस्तुओं को झंडी देता है।

यह कोणीय के साथ आम है। उदाहरण के लिए, यदि आपको ngResource के साथ ऑब्जेक्ट मिलता है, तो आपकी ऑब्जेक्ट सभी रिसोर्स API को एम्बेड करेगी और आपको $ save जैसी विधियाँ दिखाई देंगी, आदि कुकीज़ के साथ AngularJS एक प्रॉपर्टी जोड़ देगा __ngDebug।


मुझे इन संपत्तियों को कैसे निकालना चाहिए? क्या कोणीय ऐसा करने का कोई तरीका प्रदान करता है?
नीलेश

1
कोणीय मॉडल टूट जाएगा यदि आप उस संपत्ति को हटाने की कोशिश करते हैं, तो मैं चर को कॉपी करने की सलाह देता हूं। देखिए @ डेविड-बोइक का जवाब हैश को कैसे छानना है
अलेक्जेंडर इबारा

23

यदि आप अपने डेटा में आईडी नहीं जोड़ना चाहते हैं, तो आप सरणी में अनुक्रमणिका द्वारा ट्रैक कर सकते हैं, जिससे आइटम को उनके मान के बजाय सरणी में उनकी स्थिति के अनुसार रखा जाएगा।

ऐशे ही:

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

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

इसके लिए यह धारणा आवश्यक है कि आपके आइटम का क्रम कभी नहीं बदलेगा। :)
neatcoding

8

यदि आप 1.3 या उससे ऊपर के कोणीय का उपयोग कर रहे हैं, तो मेरा सुझाव है कि आप अपने एनजी-रिपीट में "ट्रैक बाय" का उपयोग करें। यदि आप "ट्रैक बाय" का उपयोग करते हैं तो कोणीय आपके सरणी में ऑब्जेक्ट्स में "$ $ हैशकेय" संपत्ति नहीं जोड़ता है। आप प्रदर्शन लाभ भी प्राप्त करते हैं, यदि आपके सरणी में कुछ परिवर्तन होता है, तो कोणीय आपके एनजी-रिपीट के लिए संपूर्ण DOM संरचना को फिर से नहीं बनाता है, यह बदले में आपके सरणी में मौजूद मानों के लिए DOM के भाग को फिर से बनाता है।


4

अद्यतन: कोणीय 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>

बस स्पष्ट करने के लिए - अभिव्यक्ति द्वारा ट्रैक में उपयोग की जाने वाली विशेषता को दोहराया संग्रह में अद्वितीय होना चाहिए। $ सूचकांक एक विकल्प है। ज्यादातर मामलों में यह पर्याप्त है, लेकिन कभी-कभी आप अद्वितीय विशेषता द्वारा ट्रैक करने के लिए उपयोगी हो सकते हैं। (आईडी, ...)
मार्टिन Hlav'a

इसके लिए यह धारणा आवश्यक है कि आपके आइटम का क्रम कभी नहीं बदलेगा। :)
neatcoding

3

यहां बताया गया है कि आप ऑब्जेक्ट से $ $ हैशके को आसानी से कैसे निकाल सकते हैं:

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

$scope.myObject - उस ऑब्जेक्ट को संदर्भित करता है जिसे आप ऑपरेशन करना चाहते हैं यानी $ $ हैशके को हटा दें

$scope.myNewObject - नई वस्तु के लिए संशोधित मूल वस्तु को असाइन करें ताकि इसे आवश्यक के रूप में उपयोग किया जा सके


मुझे यह अनावश्यक रूप से जटिल लगता है। आप बस उस एकल क्षेत्र को हटा सकते हैं - या $ से शुरू होने वाला प्रत्येक क्षेत्र। लेकिन शायद आपको दूसरे उत्तरों को देखने की जरूरत नहीं है।
सेवविक

1

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

कोणीय बहुत जादुई है जब पहली बार लोग इसे देखते हैं। जब आप अपने JS में किसी वैरिएबल को अपडेट करते हैं तो ऑटोमैटिक DOM अपडेट होता है और जब कोई DOM में इसकी वैल्यू अपडेट करता है तो वही वेरिएबल आपकी JS फाइल में अपडेट होगा। यह वही कार्यक्षमता पृष्ठ तत्वों में, और नियंत्रकों में काम करती है।

इस सब की कुंजी $ $ हैशके कोणीय है जो एनजी-रिपीट में उपयोग की जाने वाली वस्तुओं और सरणियों से जुड़ता है।

यह $ $ हैशके उन लोगों के लिए बहुत भ्रम का कारण बनता है, जो अतिरिक्त ऑब्जेक्ट को स्ट्रिप नहीं करने वाले API पर पूर्ण ऑब्जेक्ट भेज रहे हैं। एपीआई आपके सभी अनुरोधों के लिए एक 400 लौटाएगा, लेकिन वह $ $ हैश सिर्फ अपनी वस्तुओं से दूर नहीं जाएगा।

कोणीय $ $ हैशके का उपयोग करता है कि DOM में कौन से तत्व एक सरणी में किस आइटम से संबंधित हैं जो एनजी-रिपीट में लूप किए जा रहे हैं। $ $ हैशके बिना कोणीय के पास अपने समकक्ष में जावास्क्रिप्ट या डोम में होने वाले परिवर्तनों को लागू करने का कोई तरीका नहीं होगा, जो कि कोणीय के लिए मुख्य उपयोगों में से एक है।

इस सरणी पर विचार करें:

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

यदि हमने एनजी-रिपीट = "उपयोगकर्ता में उपयोगकर्ता" का उपयोग करके एक सूची में प्रदान किया है, तो इसमें प्रत्येक वस्तु को कोणीय से ट्रैकिंग उद्देश्यों के लिए $ $ हैशके प्राप्त होगा। इस $ $ हैशके से बचने के दो तरीके यहां दिए गए हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.