ng-repeat 上的 Angularjs OrderBy 不起作用
Posted
技术标签:
【中文标题】ng-repeat 上的 Angularjs OrderBy 不起作用【英文标题】:Angularjs OrderBy on ng-repeat doesn't work 【发布时间】:2014-07-18 04:09:11 【问题描述】:我正在尝试将 AngularJS 用于我的第一个项目(锦标赛经理),而 ng-repeat
上的 orderBy
过滤器不起作用:( 我已阅读所有 documentation about that,但无事可做:/
所以,我在$scope
上定义了这样的变量:
$scope.order_item = "count_win";
$scope.order_reverse = false;
$scope.teams =
100 :
id: 100,
name: "XXX",
count_win: 1,
count_loose: 2,
goal_average: 1,
,
200 :
id: 200,
name: "XXX",
count_win: 1,
count_loose: 2,
goal_average: 1,
,
[...]
;
现在,在我看来,我正在尝试重新订购(首先只有一个订单项目)但从来没有工作......
<tr ng-repeat="team in teams | orderBy:order_item:order_reverse">
<td>team.name</td>
<td>team.count_loose</td>
<td>team.goal_average</td>
</tr>
第二次,我想从 2 条信息中重新排序:count_win
和 goal_average
如果第一个相等。我尝试像这样替换 $scope.order_item
,但如果使用一个代码不起作用,他永远不会和 2 一起工作......
$scope.order_item = ['count_win','goal_average'];
感谢大家的阅读,对于帖子的大小表示抱歉。
【问题讨论】:
Angular - Can't make ng-repeat orderBy work的可能重复 【参考方案1】:$scope.teams
不是数组(它是对象的对象),orderBy
过滤器仅适用于数组。如果您将$scope.teams
设为数组,它将起作用:
$scope.teams = [
id: 100,
name: "team1",
count_win: 3,
count_loose: 2,
goal_average: 2,
,
id: 200,
name: "team2",
count_win: 3,
count_loose: 2,
goal_average: 1,
,
id: 300,
name: "team3",
count_win: 1,
count_loose: 2,
goal_average: 1,
];
或者,您可以添加一个适用于对象的特殊过滤器,如下所示(借用自 here):
app.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;
;
);
并像这样使用它:
<tr ng-repeat="team in teams | orderObjectBy:order_item:order_reverse">
请注意,此自定义过滤器不适用于问题第二部分中的排序顺序数组。
【讨论】:
何谢谢你,我明白了......我尝试添加你的 oderObjectFilter 但我不知道如何将这个添加到我的应用程序......(我知道我是新手)。 我尝试添加这样的过滤器: angular.module('orderObjectBy', []).filter('orderObjectBy', function() *** );和 angular.module('poolApp', ['poolApp.controllers', 'poolApp.services', 'orderObjectBy']);但不工作:/ angular.mo 这是一个显示它工作的 plunker:plnkr.co/edit/Ml1oLWnqPG72OokYNjb2?p=preview 如果这没有帮助,我需要查看您的代码。 它们有很多无用的代码,但你可能明白问题所在:jsfiddle.net/2u895 有趣的是,您可以 ng 重复它,但不能使用过滤器对其进行排序。希望 Angular 在这种情况下变得更加一致。如果您可以重复它,我希望能够过滤它。【参考方案2】:您不必为 orderBy 创建范围参数,如果您正在处理数组,则可以直接在标记中执行此操作。
<tr ng-repeat="team in teams | orderBy:count_win:false">
有两个参数,你应该这样做
<tr ng-repeat="team in teams | orderBy:['count_win','goal_average']">
对于更复杂的订单,您可以在您的范围内创建一个函数,如下所示:
$scope.customOrder = function (team)
//custom
就这样称呼它
<tr ng-repeat="team in teams | orderBy:customOrder">
就像@Jerrad 所说,ng-repeat
仅适用于数组,因此您需要将您的团队对象转换为数组才能使其正常工作。
【讨论】:
要将您的团队对象转换为数组? @tatarin0 你真的应该冷静下来,伙计。 对不起,我只花了 20 分钟试图弄清楚为什么你的答案不起作用。 即使是两个小时,也不是这样攻击某人的理由。此外,如果您完整地阅读了我的答案,而不是仅仅查看代码,那么您可能不会遇到这个问题。【参考方案3】:ng-repeat 仅适用于数组,不适用于 JSON 对象。 这已经在这里讨论过:Angular - Can't make ng-repeat orderBy work
您要么必须将 JSON 对象更改为数组,要么即时将其转换。 控制器可能看起来像这样:
var app = angular.module('app', []);
app.controller('Ctrl', function ($scope)
$scope.teams = [
id: 100,
name: "A Team",
count_win: 1,
count_loose: 2,
goal_average: 1
,
id: 200,
name: "C Team",
count_win: 2,
count_loose: 3,
goal_average: 4
,
id: 300,
name: "B Team",
count_win: 4,
count_loose: 1,
goal_average: 8
];
$scope.predicate = 'name';
);
我在这里用一个包含你的数据的演示创建了一个小提琴:
http://jsfiddle.net/c3VVL/
【讨论】:
以上是关于ng-repeat 上的 Angularjs OrderBy 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
ng-repeat angularJS 中的 ng-repeat
ng-repeat 内的 ng-repeat 和每个项目的 td - AngularJS