कोणीय एनजी-रिपीट एरर "रिपीटर में डुप्लिकेट की अनुमति नहीं है।"


472

मैं एक कस्टम फ़िल्टर को परिभाषित कर रहा हूँ जैसे:

<div class="idea item" ng-repeat="item in items" isoatom>    
    <div class="section comment clearfix" ng-repeat="comment in item.comments | range:1:2">
        ....
    </div>
</div>

जैसा कि आप एनजी-रिपीट देख सकते हैं, जहां फिल्टर का उपयोग किया जा रहा है, दूसरे एनजी-रिपीट के भीतर नेस्टेड है

फ़िल्टर को इस तरह परिभाषित किया गया है:

myapp.filter('range', function() {
    return function(input, min, max) {
        min = parseInt(min); //Make string input int
        max = parseInt(max);
        for (var i=min; i<max; i++)
            input.push(i);
        return input;
    };
});

मैं ला रहा हूँ:

त्रुटि: एक पुनरावर्तक में डुप्लिकेट की अनुमति नहीं है। पुनरावर्तक: आइटम में टिप्पणी। Com | रेंज: 1: 2 ngRepeatAction @ https://ajax.googleapis.com/ajax/libs/angularjs/1.1.4/an

जवाबों:


955

समाधान वास्तव में यहाँ वर्णित है: http://www.anujgakhar.com/2013/06/15/duplicates-in-a-repeater-are-not-allowed-in-angularjs/

AngularJS एनजी-रिपीट डायरेक्टिव में डुप्लिकेट की अनुमति नहीं देता है। इसका मतलब है कि यदि आप निम्नलिखित करने की कोशिश कर रहे हैं, तो आपको एक त्रुटि मिलेगी।

// This code throws the error "Duplicates in a repeater are not allowed.
// Repeater: row in [1,1,1] key: number:1"
<div ng-repeat="row in [1,1,1]">

हालांकि, एक सूचकांक को परिभाषित करने के लिए उपरोक्त कोड को थोड़ा बदलकर विशिष्टता निर्धारित करने के लिए नीचे फिर से काम करना होगा।

// This will work
<div ng-repeat="row in [1,1,1] track by $index">

आधिकारिक डॉक्स यहां हैं: https://docs.angularjs.org/error/ngRepeat/dupes


48
मैं यह उल्लेख करना चाहता था कि आप केवल $ सूचकांक ही नहीं बल्कि विशिष्टता को परिभाषित करने के लिए किसी भी कस्टम ट्रैकिंग संपत्ति को लागू कर सकते हैं। इस परिदृश्य में चूंकि वस्तुओं में कोई अन्य गुण नहीं है जो ठीक काम करता है। यह त्रुटि होने का कारण यह है कि कोणीय एक शब्द का उपयोग कर रहा है एक आइटम की आईडी को DOM संदर्भ के रूप में मान के साथ कुंजी के रूप में संग्रहीत करने के लिए। कोड (लाइन 15402 से angular.js) में ऐसा लगता है कि वे प्रदर्शन के अनुकूलन के रूप में पहले से पाए गए डोम तत्वों को अपनी कुंजी के आधार पर कैशिंग कर रहे हैं। चूँकि उन्हें अद्वितीय कुंजियों की आवश्यकता होती है, इसलिए वे इस त्रुटि को स्पष्ट रूप से फेंक देते हैं जब उन्हें डुप्लिकेट कुंजियाँ
मिलती हैं १५४१ dev

16
<div ng-repeat="row in [1,1,1,2,2] |filter: 2 track by $index" >"खोज फ़िल्टर" को "$ इंडेक्स द्वारा ट्रैक" करने से पहले होना चाहिए
झू हू

21
Yikes, क्या निरर्थक गंदा डिजाइन कोणीय भाग पर। विकास और परीक्षण के दौरान इस मुद्दे को याद करना बहुत आसान होगा, क्योंकि आपके सरणी में कभी भी डुप्लिकेट नहीं होते हैं, केवल आपके ऐप को उत्पादन में विस्फोट करने के लिए जब यह पहली बार नकल के संपर्क में आता है। मैंने "नो डुप्स" प्रतिबंध के बारे में जाने बिना पहले ही कोणीय एप्लिकेशन बनाया है; मैं अब खुद को वापस सोचता हुआ पा रहा हूं और सोच रहा हूं कि क्या मैं अनजाने में टूटे हुए कोड के लेखक हूं।
मार्क अमेरी

इस कारण से हमारा ऐप फट गया है और मैं कोणीय डेवलपर नहीं हूं, क्या $indexचर कहीं मौजूद है?
चांग झाओ

ध्यान दें कि यदि आप अपने सरणी तत्वों को अपडेट करते हैं, तो बाद में यह DOM टैग को फिर से संकलित करेगा, बजाय बासी डेटा दिखाने के। आप उपयोग कर सकते हैं track by ($index + ':' + row)तो यह अलग-अलग अपडेट करेगा <ng-repeat>ड्यूप्स से अधिक ट्रिपिंग के बिना रों जब भी अपने डेटा अद्यतन, साथ ही जब एक नए तत्व जोड़ दिया जाता है, के रूप में
Hashbrown

45

जिन लोगों को JSON की उम्मीद है और अभी भी वही त्रुटि हो रही है, सुनिश्चित करें कि आप अपना डेटा पार्स करते हैं:

$scope.customers = JSON.parse(data)

4
यह मेरे लिए काम नहीं करता, मैं json उम्मीद करते हैं, $ http सेवा, लेकिन सिंटैक्स उपयोग करने के बाद: Object.parse पर अप्रत्याशित टोकन ओ (देशी)
औरिलिअस

1
@ फर्गू खुश है कि यह आपके लिए काम करता है; हालाँकि, JSON.parse और JSON.stringify के बीच के अंतर को देखना सुनिश्चित करें जब तक कि आप पहले से ही नहीं जानते।
उपयोगी

2
पागल। महीनों तक सही ढंग से काम करने के बाद, कोणीय ने अचानक निर्णय लिया कि JSON $ http से वापस आ गया () अब JSON नहीं था। स्पष्ट रूप से पार्स करने से यह समस्या हमारे लिए हल हो गई। पागल सुझाव के लिए धन्यवाद।
एरिक एल।

12

मुझे अपनी परियोजना में एक समस्या हो रही थी जहां मैं $ इंडेक्स द्वारा एनजी-रिपीट ट्रैक का उपयोग कर रहा था, लेकिन डेटाबेस से डेटा आने पर उत्पाद प्रतिबिंबित नहीं हो रहे थे। मेरा कोड नीचे दिया गया है:

<div ng-repeat="product in productList.productList track by $index">
  <product info="product"></product>
 </div>

उपरोक्त कोड में, उत्पाद को प्रदर्शित करने के लिए उत्पाद एक अलग निर्देश है। लेकिन मुझे पता चला कि जब हम दायरे से डेटा पास करते हैं तो $ इंडेक्स जारी करता है। इसलिए डेटा हानि और DOM को अपडेट नहीं किया जा सकता है।

मैं नीचे की तरह एनजी-दोहराने में एक कुंजी के रूप में product.id का उपयोग करके समाधान पाया:

<div ng-repeat="product in productList.productList track by product.id">
  <product info="product"></product>
 </div>

लेकिन उपरोक्त कोड फिर से विफल हो जाता है और जब एक से अधिक उत्पाद एक ही आईडी के साथ आते हैं तो नीचे की त्रुटि को फेंक देते हैं:

angular.js: 11706 त्रुटि: [ngRepeat: dupes] एक पुनरावर्तक में डुप्लिकेट की अनुमति नहीं है। अद्वितीय कुंजियों को निर्दिष्ट करने के लिए 'ट्रैक बाय' एक्सप्रेशन का उपयोग करें। अपराधी

तो आखिरकार मैंने नीचे की तरह एनजी-रिपीट की डायनामिक अद्वितीय कुंजी बनाकर समस्या का हल किया:

<div ng-repeat="product in productList.productList track by (product.id + $index)">
  <product info="product"></product>
 </div>

इससे मेरी समस्या हल हो गई और आशा है कि यह भविष्य में आपकी मदद करेगा।


1
निश्चित रूप track by $indexसे बेहतर होगा track by (product.id + $index)? एक बात के लिए, track by $indexसरल है, और दूसरे के लिए, आपके पास वास्तव में कोई गारंटी नहीं है कि (product.id + $index)विल के मूल्य अद्वितीय होंगे। उदाहरण के लिए, यदि आपका सरणी id5 के साथ एक उत्पाद से शुरू होता है और उसके बाद id4 के साथ एक उत्पाद है , (product.id + $index)तो दोनों के मान 5 (5 + 0 पहले उत्पाद के लिए, 4 + 1 दूसरे के लिए) होंगे और आप अभी भी एक पुनरावर्तक में डुप्लिकेट प्राप्त करने की अनुमति नहीं है त्रुटि।
मार्क अमेरी

1
मैं इस बात से सहमत हूं कि $ इंडेक्स सरल है, लेकिन उपरोक्त समाधान मेरे लिए उन सभी मुद्दों को हल करने के लिए काम कर रहा है जो मैं $ इंडेक्स के साथ सामना कर रहा था। और मेरे मामले में product.id अल्फ़ान्यूमेरिक है इसलिए (product.id + $ index) किसी भी मामले में डुप्लिकेट नहीं हो सकता है। तो इस समाधान के पीछे विचार यह था कि अगर $ सूचकांक किसी मामले में कोई समस्या पैदा कर रहा है तो हम ट्रैक के साथ किसी भी तर्क का उपयोग कर सकते हैं जिसके द्वारा आईडी को विशिष्ट रूप से बनाया गया है।
महिमा अग्रवाल

5

क्या आप अपने "रेंज" फ़िल्टर का इरादा रखते हैं?

यहाँ एक काम का नमूना है जो मुझे लगता है कि आप करने की कोशिश कर रहे हैं: http://jsfiddle.net/evictor/hz4Ep/

HTML:

<div ng-app="manyminds" ng-controller="MainCtrl">
  <div class="idea item" ng-repeat="item in items" isoatom>    
    Item {{$index}}
    <div class="section comment clearfix" ng-repeat="comment in item.comments | range:1:2">
      Comment {{$index}}
      {{comment}}
    </div>
  </div>
</div>

जे एस:

angular.module('manyminds', [], function() {}).filter('range', function() {
    return function(input, min, max) {
        var range = [];
        min = parseInt(min); //Make string input int
        max = parseInt(max);
        for (var i=min; i<=max; i++)
            input[i] && range.push(input[i]);
        return range;
    };
});

function MainCtrl($scope)
{
    $scope.items = [
        {
            comments: [
                'comment 0 in item 0',
                'comment 1 in item 0'
            ]
        },
        {
            comments: [
                'comment 0 in item 1',
                'comment 1 in item 1',
                'comment 2 in item 1',
                'comment 3 in item 1'
            ]
        }
    ];
}

1

यदि संयोग से यह त्रुटि SharePoint 2010 के साथ काम करते समय होती है: अपनी .json फ़ाइल एक्सटेंशन का नाम बदलें और अपने restService पथ को अपडेट करना सुनिश्चित करें। कोई अतिरिक्त "ट्रैक बाय $ इंडेक्स" की आवश्यकता नहीं थी।

सौभाग्य से मुझे इस तर्क के लिए यह लिंक भेजा गया था :

.json SP2010 में एक महत्वपूर्ण फ़ाइल प्रकार बन जाता है। SP2010 में कुछ वेबस्पेर्स एंडपॉइंट्स शामिल हैं। इन फ़ाइलों का स्थान 14hive \ isapi फ़ोल्डर है। इन फ़ाइलों का विस्तार .json हैं। यही कारण है कि यह ऐसी त्रुटि देता है।

"केवल इस बात की परवाह करता है कि किसी json फ़ाइल की सामग्री json है - इसका फ़ाइल एक्सटेंशन नहीं"

एक बार फ़ाइल एक्सटेंशन बदल दिए जाने के बाद, सभी सेट होने चाहिए।


0

बस अगर यह किसी और के साथ होता है, तो मैं इसे यहाँ प्रलेखित कर रहा हूँ, मुझे यह त्रुटि मिल रही थी क्योंकि मैंने गलती से एनजी-मॉडल को एनजी-रिपीट सरणी के समान सेट कर दिया था:

 <select ng-model="list_views">
     <option ng-selected="{{view == config.list_view}}"
         ng-repeat="view in list_views"
         value="{{view}}">
         {{view}}
     </option>
 </select>

के बजाय:

<select ng-model="config.list_view">
     <option ng-selected="{{view == config.list_view}}"
         ng-repeat="view in list_views"
         value="{{view}}">
         {{view}}
     </option>
 </select>

मैंने सरणी की जाँच की और कोई डुप्लिकेट नहीं था, बस अपने चर की दोहरी जाँच करें।


0

एक पुनरावर्तक में डुप्लिकेट की अनुमति नहीं है। अद्वितीय कुंजियों को निर्दिष्ट करने के लिए 'ट्रैक बाय एक्सप्रेशन' का उपयोग करें।

Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}

उदाहरण

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="angular.js"></script>

</head>
<body>
    <div ng-app="myApp" ng-controller="personController">
        <table>
            <tr> <th>First Name</th> <th>Last Name</th> </tr>
            <tr ng-repeat="person in people track by $index">
                <td>{{person.firstName}}</td>
                <td>{{person.lastName}}</td>
                <td><input type="button" value="Select" ng-click="showDetails($index)" /></td>
            </tr>

        </table> <hr />
        <table>
            <tr ng-repeat="person1 in items track by $index">
                <td>{{person1.firstName}}</td>
                <td>{{person1.lastName}}</td>
            </tr>
        </table>
        <span>   {{sayHello()}}</span>
    </div>
    <script> var myApp = angular.module("myApp", []);
        myApp.controller("personController", ['$scope', function ($scope)
        { 
            $scope.people = [{ firstName: "F1", lastName: "L1" },
                { firstName: "F2", lastName: "L2" }, 
                { firstName: "F3", lastName: "L3" }, 
                { firstName: "F4", lastName: "L4" }, 
                { firstName: "F5", lastName: "L5" }]
            $scope.items = [];
            $scope.selectedPerson = $scope.people[0];
            $scope.showDetails = function (ind) 
            { 
                $scope.selectedPerson = $scope.people[ind];
                $scope.items.push($scope.selectedPerson);
            }
            $scope.sayHello = function ()
            {
                return $scope.items.firstName;
            }
        }]) </script>
</body>
</html>

2
कृपया आपके द्वारा पोस्ट किए गए किसी भी लिंक को सभी संबद्धता घोषित करें
ड्रैकन

0

यदि आप <ul> टैग के भीतर एनजी-रिपीट कहते हैं, तो आप डुप्लिकेट की अनुमति देने में सक्षम हो सकते हैं। संदर्भ के लिए यह लिंक देखें। Todo2.html देखें


-1

मेरी JSONप्रतिक्रिया इस तरह थी:

{"items": 
  &nbsp;[
    &nbsp;&nbsp;{
      "index": 1,
      "name": "Samantha",
      "rarity": "Scarborough",
      "email": "maureen@sykes.mk"
    },
    &nbsp;&nbsp;{
      "index": 2,
      "name": "Amanda",
      "rarity": "Vick",
      "email": "jessica@livingston.mv"
    }]
}

इसलिए, मैं ng-repeat = "item in variables.items" इसे प्रदर्शित करता था।


-1

एक पुनरावर्तक में डुप्लिकेट की अनुमति नहीं है। अद्वितीय कुंजियों को निर्दिष्ट करने के लिए 'ट्रैक बाय एक्सप्रेशन' का उपयोग करें। पुनरावर्तक: mydt में sdetail, डुप्लिकेट कुंजी: स्ट्रिंग:, डुप्लिकेट मान:

मुझे इस त्रुटि का सामना करना पड़ा क्योंकि मैंने अपने php एपीआई भाग में गलत डेटाबेस नाम लिखा था ......

तो यह त्रुटि तब भी हो सकती है जब आप डेटाबेस बेस से डेटा ला रहे हैं, जिसका नाम आपके द्वारा गलत लिखा गया है।

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