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不知道key
和value
。
我创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>