Angular – 不能让ng-repeat orderBy工作

我已经尝试了许多与orderBy ng-repeat的例子,但我不能让我的JSON工作。

<div ng-app> <script type="text/javascript" src="http://code.angularjs.org/1.0.1/angular-1.0.1.js"></script> <div ng:controller="Main"> <div ng-repeat="release in releases| orderBy:'environment_id'"> {{release.environment_id}} </div> </div> </div> 

和JSON

 function Main($scope) { $scope.releases = { "tvl-c-wbap001 + tvl-webapp": { "timestamp": " 05:05:53 PM ", "environment_id": "CERT5", "release_header": "Projects/Dev", "date": "19 Oct", "release": "12.11.91-1" }, "tvl-c-wbap401 + tvl-webapp": { "timestamp": " 10:07:25 AM ", "environment_id": "CERT4", "release_header": "Future Release", "date": "15 Oct", "release": "485-1" }, "tvl-c-wbap301 + tvl-webapp": { "timestamp": " 07:59:48 AM ", "environment_id": "CERT3", "release_header": "Next Release", "date": "15 Oct", "release": "485-1" }, "tvl-c-wbap201 + tvl-webapp": { "timestamp": " 03:34:07 AM ", "environment_id": "CERT2", "release_header": "Next Changes", "date": "15 Oct", "release": "13.12.3-1" }, "tvl-c-wbap101 + tvl-webapp": { "timestamp": " 12:44:23 AM ", "environment_id": "CERT1", "release_header": "Production Mirror", "date": "15 Oct", "release": "13.11.309-1" }, "tvl-s-wbap002 + tvl-webapp": { "timestamp": " 12:43:23 AM ", "environment_id": "Stage2", "date": "15 Oct", "release": "13.11.310-1" }, "tvl-s-wbap001 + tvl-webapp": { "timestamp": " 11:07:38 AM ", "environment_id": "Stage1", "release_header": "Production Mirror", "date": "11 Oct", "release": "13.11.310-1" }, "tvl-p-wbap001 + tvl-webapp": { "timestamp": " 11:39:25 PM ", "environment_id": "Production", "release_header": "Pilots", "date": "14 Oct", "release": "13.11.310-1" }, "tvl-p-wbap100 + tvl-webapp": { "timestamp": " 03:27:53 AM ", "environment_id": "Production", "release_header": "Non Pilots", "date": "11 Oct", "release": "13.11.309-1" } } 

不pipe我写什么,我总是得到相同的顺序,或者我可以说,没有顺序。

orderBy仅适用于数组 – 请参阅http://docs.angularjs.org/api/ng.filter:orderBy

另外一个很好的filter,用于对象,而不是数组@ Angularjs ngBuffer OrderBy ng-repeat不起作用

如前所述,只有数组是允许的。 但是为了让你更简单,你可以通过pipe道函数将对象dynamic转换为数组,如https://gist.github.com/brev/3949705

只需声明filter,并将其添加到ng重复:)

 <div ng-app="myApp"> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script> <div ng-controller="Main"> <div ng-repeat="release in releases | object2Array | orderBy:'environment_id'">{{release.environment_id}}</div> </div> <script> var app = angular.module('myApp', []).filter('object2Array', function() { return function(input) { var out = []; for(i in input){ out.push(input[i]); } return out; } }) .controller('Main',function ($scope) { $scope.releases = {"tvl-c-wbap001 + tvl-webapp":{"timestamp":" 05:05:53 PM ","environment_id":"CERT5","release_header":"Projects/Dev","date":"19 Oct","release":"12.11.91-1"},"tvl-c-wbap401 + tvl-webapp":{"timestamp":" 10:07:25 AM ","environment_id":"CERT4","release_header":"Future Release","date":"15 Oct","release":"485-1"},"tvl-c-wbap301 + tvl-webapp":{"timestamp":" 07:59:48 AM ","environment_id":"CERT3","release_header":"Next Release","date":"15 Oct","release":"485-1"},"tvl-c-wbap201 + tvl-webapp":{"timestamp":" 03:34:07 AM ","environment_id":"CERT2","release_header":"Next Changes","date":"15 Oct","release":"13.12.3-1"},"tvl-c-wbap101 + tvl-webapp":{"timestamp":" 12:44:23 AM ","environment_id":"CERT1","release_header":"Production Mirror","date":"15 Oct","release":"13.11.309-1"},"tvl-s-wbap002 + tvl-webapp":{"timestamp":" 12:43:23 AM ","environment_id":"Stage2","date":"15 Oct","release":"13.11.310-1"},"tvl-s-wbap001 + tvl-webapp":{"timestamp":" 11:07:38 AM ","environment_id":"Stage1","release_header":"Production Mirror","date":"11 Oct","release":"13.11.310-1"},"tvl-p-wbap001 + tvl-webapp":{"timestamp":" 11:39:25 PM ","environment_id":"Production","release_header":"Pilots","date":"14 Oct","release":"13.11.310-1"},"tvl-p-wbap100 + tvl-webapp":{"timestamp":" 03:27:53 AM ","environment_id":"Production","release_header":"Non Pilots","date":"11 Oct","release":"13.11.309-1"}} }); </script> 

迭代对象时,内置的orderByfilter将不再工作。 由于对象字段的存储方式而被忽略。 您需要创build一个自定义filter

 yourApp.filter('orderObjectBy', function() { return function(items, field, reverse) { var filtered = []; angular.forEach(items, function(item) { filtered.push(item); }); filtered.sort(function (a, b) { return (a[field] > b[field] ? 1 : -1); }); if(reverse) filtered.reverse(); return filtered; }; }); <ul> <li ng-repeat="item in items | orderObjectBy:'color':true">{{ item.color }}</li> </ul> 

在Eike Thies上面的回应中,如果我们使用underscore.js,filter可以被简化为:

 var app = angular.module('myApp', []).filter('object2Array', function() { return function(input) { return _.toArray(input); } }); 

这里是@ Julian Mosquera的代码的一个版本,它也支持按对象sorting:

 yourApp.filter('orderObjectBy', function () { return function (items, field, reverse) { // Build array var filtered = []; for (var key in items) { if (field === 'key') filtered.push(key); else filtered.push(items[key]); } // Sort array filtered.sort(function (a, b) { if (field === 'key') return (a > b ? 1 : -1); else return (a[field] > b[field] ? 1 : -1); }); // Reverse array if (reverse) filtered.reverse(); return filtered; }; }); 

你将不得不重新格式化你的发布对象是一个对象数组 。 然后你就可以按你试图的方式对它们进行sorting。

要添加到上面的朱利安的答案,orderObjectBy是一个独立的angular度模块: https : //github.com/fmquaglia/ngOrderObjectBy

orderby在包含immidiate值的对象的数组上可以用作filter,即

 controller.images = [{favs:1,name:"something"},{favs:0,name:"something else"}]; 

当上述数组重复时,可以使用| orderBy:'favs'可以直接引用该值,或者在前面使用减号来降序

 <div class="timeline-image" ng-repeat="image in controller.images | orderBy:'-favs'"> <img ng-src="{{ images.name }}"/> </div>