Angular 1:ng-repeat会引发infdig错误

时间:2017-02-15 14:11:29

标签: angularjs angularjs-ng-repeat httprequest ng-repeat angularjs-infdig

控制器:

(function(angular) {

    var app = angular.module('t2w');

    app.factory('httpq', function($http, $q) {
        return {
            get: function() {
                var deferred = $q.defer();
                $http.get.apply(null, arguments).success(deferred.resolve).error(deferred.resolve);
                return deferred.promise;
            }
        }
    });

    app.controller('JobsCtrl', ['$scope','httpq','baseUrl', function($scope, httpq, baseUrl) {

        httpq.get(baseUrl + '/jobs/json').then(function(data) {
            $scope.jobs = data;
        }).catch(function(data, status) {
            console.error('Error', response.status, response.data);
        }).finally(function() {
        });

        $scope.random = function() {
            return 0.5 - Math.random();
        };
    }]);

})(window.angular);

查看:

...

<tbody>
    <tr ng-repeat="job in jobs | orderBy:random">
        <td class="jobtitle">
            <a href="#jobs/{{job._id}}">
                {{job.title}} m/w
            </a>
            <p>
                {{job.introText | limitTo: 150}}...
            </p>
        </td>
        <td>
            {{job.area}}
        </td>
    </tr>
</tbody>

...

JSON响应:

{
    "_id": "5880ae65ff62b610h4de2740",
    "updatedAt": "2017-01-19T12:17:37.027Z",
    "createdAt": "2017-01-19T12:17:37.027Z",
    "title": "Job Title",
    "area": "City",
    "introText": "Lorem Ipsum Sit Dolor",
    ...
}

错误:

  

angular.js:13920错误:[$ rootScope:infdig]

有人可以给我一个提示,为什么我会收到此错误?已经检查过文档,我没有在ng-repeat中调用函数,也不会在每次调用时生成一个新的数组。

2 个答案:

答案 0 :(得分:2)

如果您希望ng-repeat随机对数据进行排序,则必须按照以下方式应用自己的过滤器:

.filter('shuffle', function() {
    return function(ary) {
        return _.shuffle(ary);
    }
});

接下来就像这样使用它:

<tr ng-repeat='job in job | shuffle'>

答案 1 :(得分:1)

我为解决问题所做的是在控制器中随机排序数组,而不是在视图中:

function shuffle(array) {
    var currentIndex = array.length, temporaryValue, randomIndex;
    while (0 !== currentIndex) {
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex -= 1;
        temporaryValue = array[currentIndex];
        array[currentIndex] = array[randomIndex];
        array[randomIndex] = temporaryValue;
    }
    return array;
}

$scope.jobs = shuffle($scope.jobs);