Angularjs OrderBy on ng repeat不';行不通

Angularjs OrderBy on ng repeat不';行不通,angularjs,angularjs-ng-repeat,angularjs-filter,Angularjs,Angularjs Ng Repeat,Angularjs Filter,我正在尝试将AngularJS用于我的第一个项目(一个锦标赛管理器),而ng repeat上的orderBy过滤器不起作用:(我已经阅读了所有的/ 因此,我在$scope上定义了vars,如下所示: $scope.order_item = "count_win"; $scope.order_reverse = false; $scope.teams = { 100 : { id: 100, name: "XXX", count_win: 1, count_lo

我正在尝试将AngularJS用于我的第一个项目(一个锦标赛管理器),而
ng repeat
上的
orderBy
过滤器不起作用:(我已经阅读了所有的/

因此,我在
$scope
上定义了vars,如下所示:

$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>

感谢大家的阅读,并对文章大小表示歉意。

您不必为orderBy创建范围参数,如果您处理的是数组,您可以直接在标记中创建范围参数

<tr ng-repeat="team in teams | orderBy:count_win:false">
就这样说吧

<tr ng-repeat="team in teams | orderBy:customOrder">


就像@Jerrad所说的,
ng repeat
只对数组有效,所以你需要将你的团队对象转换成一个数组才能正常工作。

$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,
     }
];
或者,您可以添加一个适用于对象的特殊过滤器,如(借用自):

然后像这样使用它:

<tr ng-repeat="team in teams | orderObjectBy:order_item:order_reverse">
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';
});


请注意,此自定义筛选器不会像问题的第二部分中那样处理排序顺序的数组。

ng repeat仅对数组有效,对JSON对象无效。 这里已经讨论了这一点:

您要么将JSON对象更改为数组,要么动态转换它。 然后,控制器可以如下所示:

<tr ng-repeat="team in teams | orderObjectBy:order_item:order_reverse">
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';
});
我在这里创建了一个包含您的数据的演示文件:


将团队对象转换为数组可能存在的副本?@tatarin0你真的应该冷静下来。对不起,我刚刚花了20分钟试图找出你的答案不起作用的原因。即使是2小时,也不是攻击这样的人的理由。此外,如果你完全阅读了我的答案,而不是仅仅看代码,你可能不会有这个问题。谢谢你,我明白了…我试图添加你的oderObjectFilter,但我不知道如何将这个添加到我的应用程序中…(我知道我是新手:S)。我尝试过这样添加过滤器:angular.module('orderObjectBy',[])。filter('orderObjectBy',function(){***});angular.module('poolApp',['poolApp.Controller'、'poolApp.services'、'orderObjectBy']);但不起作用:/angular。moHere有一个plunker显示它起作用了:如果这没有帮助,我需要看看你的代码。它们是很多无用的代码,但你可能理解问题:有趣的是,你不能重复它,但不能对它使用按顺序筛选。希望angular在这种情况下更加一致。如果你能重复它,我会退出pect能够对其进行过滤。
<tr ng-repeat="team in teams | orderObjectBy:order_item:order_reverse">
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';
});