这是使用PHP生成的json
[{"Sale":{"id":"1","customer_id":"1","amount":"15","created":"2014-05-17"}}]
执行orderBy:id
显然无效。我在其他帖子中读到需要为这种数据结构创建orderBy函数。我无法创建该功能。任何人都可以告诉我解决这个问题的正确方法是什么?
答案 0 :(得分:56)
假设你有:
$scope.sales = [{"Sale":{"id":"1"}},{"Sale":{"id":"2"}},{"Sale":{"id":"3"}}];
为什么不做以下事情:
<div ng-repeat="sale in sales | orderBy:'Sale.id':true">
{{ sale.Sale.id }}
</div>
它适合我的情况。可能是Angular在你提出这个问题的时候不支持它。
答案 1 :(得分:5)
这些类型的数据操作我喜欢将它们保存在适当的角度对象中,因此我会创建自定义过滤器,例如:
var sampleSource= [{"Sale":{"id":"8","customer_id":"1","amount":"15","created":"2014-05-17"}}, {"Sale":{"id":"5","customer_id":"6","amount":"15","created":"2015-05-17"}}];
var myApp = angular.module('myApp',[]);
myApp.filter('myFilter', function() {
return function(items) {
items.sort(function(a,b){
if (parseInt(a.Sale.id) > parseInt(b.Sale.id))
return 1;
if (parseInt(a.Sale.id) < parseInt(b.Sale.id))
return -1;
return 0; })
});
重要提示:我建议使用自定义过滤器,因为作为个人偏好,我不喜欢使用任务(代码)重载我的控制器或其他对象,我可以将其分离到其他对象上,从而使我更加独立更清洁的代码(我喜欢角度的事情之一)但除了这个个人偏好我会说这是不是唯一的方法,但如果你分享我背后的原因,我希望它有所帮助。
答案 2 :(得分:0)
myapp.filter('orderBySub', function () {
return function (items, field, reverse) {
byString = function(o, s) {
s = s.replace(/\[(\w+)\]/g, '.$1');
s = s.replace(/^\./, '');
var a = s.split('.');
for (var i = 0, n = a.length; i < n; ++i) {
var k = a[i];
if (k in o) {
o = o[k];
} else {
return;
}
}
return o;
}
items.sort(function (a, b) {
if (byString(a, field) > byString(b, field))
return reverse ? -1 : 1;
if (byString(a, field) < byString(b, field))
return reverse ? 1 : -1;
return 0;
})
return items;
}
});
示例
ng-repeat="task in tasks | orderBySub: 'field1.subfield2.subsubfield3':true"
true =反向