Angularjs 为什么这种排序会导致无限摘要错误?

Angularjs 为什么这种排序会导致无限摘要错误?,angularjs,angularjs-digest,Angularjs,Angularjs Digest,架构如下:我有一个控制器和一个服务。控制器可以调用服务并对其数据进行排序。我有一个服务方法setSort,它只是在服务中设置一个变量。控制器监视服务中的数据。如果排序是活动的,我会得到一个无限摘要错误。演示: /** *带排序的角度快速变化数据 */ console.clear(); 角度.module('app',[]) .controller('main',函数($scope,dataSvc,$timeout){ $scope.items=dataSvc.generateData().ge

架构如下:我有一个控制器和一个服务。控制器可以调用服务并对其数据进行排序。我有一个服务方法
setSort
,它只是在服务中设置一个变量。控制器监视服务中的数据。如果排序是活动的,我会得到一个无限摘要错误。演示:

/**
*带排序的角度快速变化数据
*/
console.clear();
角度.module('app',[])
.controller('main',函数($scope,dataSvc,$timeout){
$scope.items=dataSvc.generateData().getData();
$scope.$watch(dataSvc.getData,函数(curr,orig){
如果(当前!==原始){
$scope.items=curr;
}
});
var-toggle=true;
$scope.onClick=function(){
dataSvc.setSort(切换“asc”:“desc”);
切换=!切换;
};
})
.factory('dataSvc',function(){
var数据=[];
var排序;
风险价值限额=50;
//使用美国州名只是为了好玩
var州=[“阿拉巴马州”、“阿拉斯加”、“美属萨摩亚州”、“亚利桑那州”、“阿肯色州”、“加利福尼亚州”、“科罗拉多州”、“康涅狄格州”、“特拉华州”、“哥伦比亚特区”、“密克罗尼西亚联邦”、“佛罗里达州”、“乔治亚州”、“关岛”、“夏威夷州”、“爱达荷州”、“伊利诺伊州”、“印第安纳州”、“爱荷华州”、“堪萨斯州”、“肯塔基州”、“路易斯安那州”、“缅因州”、“马绍尔群岛”、“马里兰州”,“马萨诸塞州”、“密歇根州”、“明尼苏达州”、“密西西比州”、“密苏里州”、“蒙大拿州”、“内布拉斯加州”、“内华达州”、“新罕布什尔州”、“新泽西州”、“新墨西哥州”、“纽约州”、“北卡罗来纳州”、“北达科他州”、“北马里亚纳群岛”、“俄亥俄州”、“俄克拉荷马州”、“俄勒冈州”、“帕劳州”、“宾夕法尼亚州”、“波多黎各州”、“罗德岛州”、“南卡罗来纳州”、“南达科他州”田纳西州、德克萨斯州、犹他州、佛蒙特州、维尔京群岛、弗吉尼亚州、华盛顿州、西弗吉尼亚州、威斯康星州、怀俄明州];
函数生成数据(限制){
var n=0;
var数据=[];
while(n

JS-Bin
切换排序
  • {{item.id}}
    {{item.score}
您正在查看的
dataSvc.getData()
函数每次都返回不同的对象。Angular将继续运行摘要循环,直到它正在查看的所有内容不变。您可以通过取消
$watch
来解决此问题

JS

HTML


  • 使用
    watchCollection
    也可以。我认为它每次都返回相同的数组,因为
    sort
    在适当的位置进行排序并返回相同的数组,例如
    var arr=[3,2,1];arr.sort()==arr.sort();/=>true
    。而
    ..sortByOrder
    则不是这样。
    $scope.getItems = function() {
      return dataSvc.getData();
    };
    
    <li ng-repeat="item in getItems() track by item.id">