কৌণিক এনজি-রিপিট ত্রুটি "একটি রিপিটারে সদৃশগুলি অনুমোদিত নয়।"


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;
    };
});

আমি পাচ্ছি:

ত্রুটি: একটি পুনরাবৃত্তির সদৃশ অনুমোদিত নয়। পুনরুক্তি: আইটেম ডটকমেন্টস এ মন্তব্য | ব্যাপ্তি: 1: 2 এনজিপিপিটেশন @ https://ajax.googleapis.com/ajax/libs/angularjs/1.1.4/an

উত্তর:


955

সমাধানটি এখানে আসলে বর্ণিত হয়েছে: http://www.anujgakhar.com/2013/06/15/du-uplic p a p p

অ্যাঙ্গুলারজেএস কোনও এনজি-রিপিট নির্দেশিকায় নকলকে অনুমতি দেয় না। এর অর্থ যদি আপনি নিম্নলিখিতটি করার চেষ্টা করছেন তবে আপনি একটি ত্রুটি পাবেন।

// 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
আমি উল্লেখ করতে চেয়েছিলাম যে আপনি কেবল $ সূচকটি নয়, স্বতন্ত্রতা সংজ্ঞায়িত করতে যে কোনও কাস্টম ট্র্যাকিং সম্পত্তি প্রয়োগ করতে পারেন। যেহেতু এই দৃশ্যে অবজেক্টগুলির অন্য কোনও বৈশিষ্ট্য নেই যা এটি কাজ করে। এই ত্রুটিটি হওয়ার কারণটি হ'ল কৌণিক একটি অভিধান ব্যবহার করে কোনও আইটেমের আইডি ডিওএম রেফারেন্স হিসাবে মান সহ কী হিসাবে সংরক্ষণ করে। কোড থেকে (কৌণিক.জেজে 15402 লাইন) দেখে মনে হচ্ছে তারা পারফরম্যান্স অপটিমাইজেশন হিসাবে তাদের কী-এর উপর ভিত্তি করে আগে পাওয়া ডিওএম উপাদানগুলি ক্যাশে করছে। যেহেতু তারা অনন্য কি প্রয়োজন তারা স্পষ্টভাবে এই ত্রুটি নিক্ষেপ যখন তারা লাইন 15417 উপর ডুপ্লিকেট চাবি খুঁজে
devshorts

16
<div ng-repeat="row in [1,1,1,2,2] |filter: 2 track by $index" >"অনুসন্ধান ফিল্টার" "ট্র্যাক বাই $ সূচক" এর আগে হওয়া দরকার
ঝে হু

21
ওহে, অ্যাংুলারের অংশে কী অর্থহীন। বিকাশ এবং পরীক্ষার সময় এই সমস্যাটি খুব সহজেই মিস করা খুব সহজ হবে কারণ আপনার অ্যারেতে কখনই সদৃশ থাকে না, কেবলমাত্র আপনার অ্যাপ্লিকেশনটি যখন প্রথমবারের মতো ডুপসের সংস্পর্শে আসে তখন এটি উত্পাদনে বিস্ফোরিত হয়। "নো ডুপস" নিষেধাজ্ঞার কথা না জেনে আমি আগে কৌণিক অ্যাপস তৈরি করেছি; আমি এখন নিজেকে ফিরে ভাবছি এবং ভাবছি যে আমি অজান্তেই ভাঙা কোডটি লিখেছি কিনা wond
মার্ক আমেরিকা

আমাদের অ্যাপটি এই কারণে বিস্ফোরিত হয়েছে এবং আমি কৌনিক বিকাশকারী নই, $indexভেরিয়েবলটি কি কোথাও বিদ্যমান?
চ্যাং ঝাও

নোট করুন সেখানে যদি আপনি আপনার অ্যারে উপাদানগুলি পরে আপডেট করেন তবে এটি বাসী ডেটা দেখিয়ে পরিবর্তে ডোম ট্যাগগুলি পুনরায় সংকলন করবে না। আপনি এটি ব্যবহার করতে পারেন track by ($index + ':' + row)যাতে এটি পৃথক <ng-repeat>তথ্য আপডেট করে যখনই এর ডেটা আপডেট হয়, পাশাপাশি যখন কোনও নতুন উপাদান যুক্ত হয় তখন
দু'পাশে

45

যারা JSON প্রত্যাশা করেন এবং এখনও একই ত্রুটি পেয়েছেন, নিশ্চিত হয়ে নিন যে আপনি নিজের ডেটা পার্স করেছেন:

$scope.customers = JSON.parse(data)

4
এটি আমার পক্ষে কার্যকর হয় না, আমি son এইচটিপি পরিষেবা ব্যবহারের পরে জসনকে প্রত্যাশা করি, তবে সিনট্যাক্স এরর: অবজেক্ট.পারস (নেটিভ) এ অপ্রত্যাশিত টোকেন ও
অরেলিয়াস

1
@ ফার্গাস আনন্দিত এটি আপনার পক্ষে কাজ করে; তবে, জেএসওএন.পার্স এবং জেএসওএন স্ট্রিংফাইয়ের মধ্যে পার্থক্যটি সন্ধান করা নিশ্চিত করুন যদি না আপনি ইতিমধ্যে জানেন।
দরকারী দেখুন

2
ক্রেজি। কয়েক মাস ধরে সঠিকভাবে কাজ করার পরে, কৌণিক হঠাৎ সিদ্ধান্ত নিয়েছিল যে JSON $ http () থেকে ফিরে এসেছে আর জেএসএন নেই। সুস্পষ্টভাবে পার্স করা আমাদের জন্য এই সমস্যাটি সমাধান করেছে। উন্মাদ পরামর্শের জন্য ধন্যবাদ।
এরিক এল

12

আমার প্রকল্পে আমার একটি সমস্যা ছিল যেখানে আমি $ সূচক দ্বারা এনজি-রিপিট ট্র্যাক ব্যবহার করি তবে ডেটাবেস থেকে ডেটা আসে তখন পণ্যগুলি প্রতিফলিত হয় না। আমার কোডটি নীচের মতো:

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

উপরের কোডে পণ্যটি পণ্য প্রদর্শন করার জন্য একটি পৃথক নির্দেশনা i তবে আমি জানতে পেরেছিলাম যে যখন আমরা সুযোগ থেকে ডেটা আউট করি তখন $ সূচকটি সমস্যার কারণ হয়। সুতরাং ডেটা ক্ষতি এবং DOM আপডেট করা যাবে না।

আমি নীচের মতো এনজি-রিপিটের মূল হিসাবে product.id ব্যবহার করে সমাধানটি পেয়েছি:

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

কিন্তু উপরের কোডটি আবার ব্যর্থ হয় এবং নীচের ত্রুটিটি ছুঁড়ে দেয় যখন একাধিক পণ্য একই আইডি নিয়ে আসে:

কৌণিক.জেএস: ১১70০ Error ত্রুটি: [এনজিপিপিট: ডুপস] একটি রিপিটারে নকলগুলি অনুমোদিত নয়। অনন্য কী নির্দিষ্ট করতে এক্সপ্রেশনটি বাই ট্র্যাক করুন। পুনরায় কারক

সুতরাং অবশেষে আমি নীচের মতো এনজি-রিপিটের গতিশীল অনন্য কী তৈরি করে সমস্যার সমাধান করেছি:

<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 দিয়ে কোনও পণ্য দিয়ে শুরু হয় এবং তার পরে 4 এর সাথে একটি পণ্য থাকে তবে idতাদের মান (product.id + $index)উভয়ই 5 (প্রথম পণ্যটির জন্য 5 + 0, দ্বিতীয়টির জন্য 4 + 1) হবে এবং আপনি তবুও একটি পুনর্বারকারীর মধ্যে নকল পেতে ত্রুটি অনুমোদিত নয়
মার্ক আমেরিকা

1
আমি একমত যে $ সূচীটি সহজ সরল তবে $ সূচক নিয়ে আমি যে সমস্ত সমস্যার মুখোমুখি ছিলাম তা সমাধান করার জন্য উপরের সমাধানটি আমার পক্ষে কাজ করা হয়েছে। এবং আমার ক্ষেত্রে product.id আলফানিউমেরিক তাই কোনও (product.id + $ index) কোনও ক্ষেত্রে সদৃশ হতে পারে না। সুতরাং এই সমাধানের পিছনে ধারণাটি ছিল $ সূচক যদি কোনও ক্ষেত্রে সমস্যা সৃষ্টি করে তবে আমরা ট্র্যাক সহ যে কোনও যুক্তি ব্যবহার করতে পারি যার মাধ্যমে আইডি অনন্যভাবে তৈরি করা হয়।
মহিমা অগ্রবাল

5

আপনি আপনার "পরিসীমা" ফিল্টারটি কী করতে চান?

এখানে আমি যা একটি পরিশ্রমী নমুনা মনে আপনি কি করার চেষ্টা করছেন যারা http://jsfiddle.net/evictor/hz4Ep/

এইচটিএমএল:

<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

যদি ভাগ্যক্রমে শেয়ারপয়েন্ট 2010 এর সাথে কাজ করার সময় এই ত্রুটিটি ঘটে: আপনার .json ফাইল এক্সটেনশনের নাম পরিবর্তন করুন এবং আপনার রেস্টসেসভারের পথটি আপডেট করার বিষয়ে নিশ্চিত হন। অতিরিক্ত "ট্র্যাক বাই $ ইনডেক্স" প্রয়োজন হয়নি।

ভাগ্যক্রমে আমি এই যুক্তিতে এই লিঙ্কটি ফরোয়ার্ড করেছি :

.json SP2010 এ একটি গুরুত্বপূর্ণ ফাইল টাইপ হয়ে যায়। SP2010 এ সুনির্দিষ্ট ওয়েবসার্ভির শেষ পয়েন্ট রয়েছে। এই ফাইলগুলির অবস্থান 14hive \ ইসপি ফোল্ডার। এই ফাইলগুলির এক্সটেনশন হ'ল .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
দয়া করে আপনার পোস্ট করা কোনও লিঙ্কের সমস্ত অনুমোদিততা ঘোষণা করুন
ড্রেন


-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

একটি পুনরাবৃত্তাকারে নকলগুলি অনুমোদিত নয়। অনন্য কী নির্দিষ্ট করতে এক্সপ্রেশনটি বাই ট্র্যাক করুন। পুনরুক্তকারী: মাইডডিতে এসডেটেল, সদৃশ কী: স্ট্রিং:, সদৃশ মান:

আমি এই ত্রুটির মুখোমুখি হয়েছি কারণ আমি আমার পিএইচপি এপিআই অংশে ভুল ডাটাবেসের নাম লিখেছিলাম ......

সুতরাং আপনি যখন ডাটাবেস বেস থেকে ডেটা আনছেন তখন এই ত্রুটিটিও ঘটতে পারে, যার নামটি আপনার দ্বারা ভুল লেখা আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.