Angularjs OrderBy on ng-repeat不起作用

Art*_*hur 35 angularjs angularjs-ng-repeat angularjs-filter

我正在尝试使用AngularJS作为我的第一个项目(锦标赛经理)并且orderBy过滤器ng-repeat不起作用:(我已阅读有关该文档的所有文档,但无所事事:/

所以,我有$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,
  },
  [...]
};
Run Code Online (Sandbox Code Playgroud)

现在,根据我的观点,我正在尝试重新排序(首先只有一个订单项)但从未工作......

<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>
Run Code Online (Sandbox Code Playgroud)

第二次,我想从2条信息来重新排序:count_wingoal_average如果第一是平等的.我尝试更换$scope.order_item这样的,但如果一个代码没有工作,他绝不会与2工作...

$scope.order_item = ['count_win','goal_average'];
Run Code Online (Sandbox Code Playgroud)

谢谢大家的阅读和对不起的帖子大小.

Jer*_*rad 56

$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,
     }
];
Run Code Online (Sandbox Code Playgroud)

或者,您可以添加一个适用于对象的特殊过滤器,如下所示(从这里借用):

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;
  };
});
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

<tr ng-repeat="team in teams | orderObjectBy:order_item:order_reverse">
Run Code Online (Sandbox Code Playgroud)

请注意,此自定义过滤器不适用于排序顺序数组,如问题的第二部分所示.


Bal*_*zar 11

您不必为orderBy创建范围参数,如果要处理数组,可以直接在标记中执行此操作.

<tr ng-repeat="team in teams | orderBy:count_win:false">
Run Code Online (Sandbox Code Playgroud)

有两个参数,你应该这样做

<tr ng-repeat="team in teams | orderBy:['count_win','goal_average']">
Run Code Online (Sandbox Code Playgroud)

在更复杂的订单之后,您可以在您的范围内创建一个函数,如下所示:

$scope.customOrder = function (team) {
    //custom
}
Run Code Online (Sandbox Code Playgroud)

并称之为

<tr ng-repeat="team in teams | orderBy:customOrder">
Run Code Online (Sandbox Code Playgroud)

就像@Jerrad所说,ng-repeat只适用于数组,所以你需要将你的团队对象转换成数组才能使它正常工作.


小智 8

ng-repeat仅适用于数组,不适用于JSON对象.这里已经讨论过了:Angular - 无法使ng-repeat orderBy工作

您必须将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';
});
Run Code Online (Sandbox Code Playgroud)

我在这里用一个包含你的数据的演示创建了一个小提琴:

http://jsfiddle.net/c3VVL/