1

控制器:角1:NG-重复抛出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 Error: [$rootScope:infdig]

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

+0

can you显示'$ scope.jobs'值? –

+1

我认为它会抛出错误,因为'random'实际上是一个函数。尝试没有'orderBy' –

+0

$ scope.jobs = 阵列(20) 0:对象 1:对象 2:对象... ... – mrks

回答

1

我做了什么来解决问题是在控制器中随机排列Array而不是在视图中排序:

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

如果你想ng-repeat数据随机排序,你将不得不申请自己的过滤器是这样的:

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

下次使用它,鉴于这样的:

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

仍然使用此过滤器抛出'[$ rootScope:infdig]'。 – mrks

+0

[这里](https://plnkr.co/edit/Xy7AjgJQZYCOEOFEaNVD?p=preview)正在工作plunker –

+0

我想问题是,我有一个数组与多个对象。所以这就是为什么洗牌过滤器解决方案仍然无法正常工作。 – mrks