Angular ng-repeat Error “Duplicates in a repeater are not allowed.”

后端 未结 10 2351
青春惊慌失措
青春惊慌失措 2020-11-22 06:11

I am defining a custom filter like so:

相关标签:
10条回答
  • 2020-11-22 06:43

    Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys.

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

    Example

    <!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>
    
    0 讨论(0)
  • 2020-11-22 06:46

    What do you intend your "range" filter to do?

    Here's a working sample of what I think you're trying to do: 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>
    

    JS:

    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'
                ]
            }
        ];
    }
    
    0 讨论(0)
  • 2020-11-22 06:47

    For those who expect JSON and still getting the same error, make sure that you parse your data:

    $scope.customers = JSON.parse(data)
    
    0 讨论(0)
  • 2020-11-22 06:50

    The solution is actually described here: http://www.anujgakhar.com/2013/06/15/duplicates-in-a-repeater-are-not-allowed-in-angularjs/

    AngularJS does not allow duplicates in a ng-repeat directive. This means if you are trying to do the following, you will get an error.

    // 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]">
    

    However, changing the above code slightly to define an index to determine uniqueness as below will get it working again.

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

    Official docs are here: https://docs.angularjs.org/error/ngRepeat/dupes

    0 讨论(0)
提交回复
热议问题