Orderby不能在ng-repeat上使用dict语法

我正在尝试使用ng-repeat与字典样式语法并应用到键值的顺序。

(key, value) in something | orderBy:'key'

看来OrderBy没有像预期的那样工作

这里的例子http://jsfiddle.net/mhXuW/

orderBy的参数必须匹配对象数组中的属性名称。

你的数据需要看起来像这样:

 $scope.list2 = [ { id:"2013-01-08T00:00:00", name:'Joe'}, { id:"2013-01-09T00:00:00", name:'Sue'}]; 

然后像这样的filter将工作:

 <div ng-repeat="item in list2 | orderBy:'id':true"> 

小提琴 。

请注意,orderBy在整个数组(上面的示例代码中的something )上工作,它返回一个sorting的数组。 orderBy不知道keyvalue

这没有实现。 请看这里:

https://github.com/angular/angular.js/issues/1286

编辑(2013年8月27日):这个问题似乎现在已经解决了。

我创build了一个自定义filter,使其成为可能的select列表:

 .filter('toDictionaryArray', function () { return function (obj) { if (!(obj instanceof Object)) return obj; var arr = []; for (var key in obj) { arr.push({ key: key, value: obj[key] }); } return arr; } }) 

select列表ng选项然后读取如下:

 <select ng-options="kv.key as kv.value for kv in p.options | toDictionaryArray | orderBy:'value'"></select> 

正如akonsu所说,这个function已经被要求在这里 。 不过,我仍然无法使用最新的(1.3.0)testing版。

在注释中有一个很好的解决方法 (注意这需要下划线 ,并且你必须在上面的例子中用'value。$ key'replace'key'的引用):

[添加filter]:

 app.filter('toArray', function() { return function(obj) { if (!(obj instanceof Object)) return obj; return _.map(obj, function(val, key) { return Object.defineProperty(val, '$key', {__proto__: null, value: key}); }); }}); 

示例标记:

 <div ng-repeat="val in object | toArray | orderBy:'priority' | filter:fieldSearch"> {{val.$key}} : {{val}} </div> 

潜在的缺点:

  • 在IE8中Object.defineProperty不会像这样工作(如果你不介意让$ key枚举,那么这是一个简单的改变)。
  • 如果你的属性值不是对象,那么你不能设置$ key属性,这会失败。
  • 它不直接集成到orderBy或ngRepeat中,所以语法不同。

这是一个很好的解决方法( angular-toArrayFilter ):

 .filter('toArray', function () { return function (obj, addKey) { if ( addKey === false ) { return Object.keys(obj).map(function(key) { return obj[key]; }); } else { return Object.keys(obj).map(function (key) { if(typeof obj[key] == 'object') return Object.defineProperty(obj[key], '$key', { enumerable: false, value: key}); }); } }; }); 

而不是使用只支持数组而不是对象的orderbyfilter。 你可以这样编写你自己的filter我从Justin Klemm处获得了代码http://justinklemm.com/angularjs-filter-ordering-objects-ngrepeat/并添加了对指定多个sorting字段的支持。; 下面的filter示例是基于值中的属性进行过滤,但您可以轻松地将其更改为基于该filter进行过滤。

 app.filter('orderObjectBy', function() { return function(items, fields, reverse) { var filtered = []; angular.forEach(items, function(item) { filtered.push(item); }); filtered.sort(function (a, b) { var result = 0; for (var i = 0; i < fields.length; ++i) { if (a[fields[i]] > b[fields[i]]) { result = 1; break; } else if (a[fields[i]] < b[fields[i]]) { result = -1; break; } } return result; }); if (reverse) { filtered.reverse(); } return filtered; }; }); 

然后在你的html5网页里面,像这样统计是一个包含键值对的地图/字典。

 <div class="row" ng-repeat="stat in statistics | orderObjectBy: 'NumTimesPartnered', 'NumTimesOpponent']:true"> <div class="col col-33">{{stat.Name}}</div> <div class="col"><center>{{stat.NumTimesPartnered}}</center></div> <div class="col"><center>{{stat.NumTimesOpponent}}</center></div> </div>