我正在尝试使用类似字典的语法来使用ng-repeat,同时对键值进行排序。
(key, value) in something | orderBy:'key'
但是似乎OrderBy没有按照预期工作。
这里有个示例: http://jsfiddle.net/mhXuW/
我正在尝试使用类似字典的语法来使用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'}];
那么这样的筛选器将起作用:
<div ng-repeat="item in list2 | orderBy:'id':true">
请注意,orderBy作用于整个数组(在您的示例代码中为something
),并返回已排序的数组。 orderBy对于key
和value
一无所知。
.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-options="kv.key as kv.value for kv in p.options | toDictionaryArray | orderBy:'value'"></select>
[Add a 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}); }); }});
Example markup:
<div ng-repeat="val in object | toArray | orderBy:'priority' | filter:fieldSearch"> {{val.$key}} : {{val}} </div>
Potential downsides:
- Object.defineProperty will not work like this in IE8 (if you don't mind making $key enumerable then this is an easy change).
- If your property values are not objects then you can't set the $key property and this fails.
- It is not directly integrated into orderBy or ngRepeat so the syntax is different.
defineProperty
而不是val.$key = key
? - Reactgular这里有一个好的解决方法(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});
});
}
};
});
不要使用只支持数组而不支持对象的 orderby 过滤器。你可以像这样编写自己的过滤器,我从 Justin Klemm http://justinklemm.com/angularjs-filter-ordering-objects-ngrepeat/ 处获取了代码,并添加了支持指定多个排序字段的功能。下面是一个用于根据值中的属性进行过滤的过滤器示例,但你也可以轻松地将其更改为根据键进行过滤。
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网页中使用它,其中statistics是一个具有键值对的映射/字典。
<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>