【问题标题】:Ranking table with sorting & dynamic columns具有排序和动态列的排名表
【发布时间】:2017-05-07 08:01:25
【问题描述】:

我正在尝试做一个排名表:

我有一个对象scores,其中包含总分,每个“挑战”都包含与此挑战相关的分数。我的主要问题是遍历scores 为每个挑战创建一个th 标签并在之后对它们进行排序。

目标:

  • 挑战的数量必须是动态的
  • 按总数(完成)和挑战排序

我的问题:

  • 如何将 ng-repeat 用于挑战数组
  • 如何对这些进行排序

我的进步:

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.sortType = 'points';
    $scope.sortReverse = false;
		$scope.scores = { 
      "6":{
        "total":5, 
        "challenges":{
          "1":{
        "challengeId":1},
      "2":{
        "point":2,
        "challengeId":2}
      }
    },
    "21":{
    "total":2, 
    "challenges":{
      "1":{
        "point":1,
        "challengeId":1},
      "2":{
        "point":1,
        "challengeId":2}
          }
        },
      }
}

myApp.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;
    };
  });
<div ng-controller="MyCtrl">
  <table>
      <tr>
        <th>Rank</th>
        <th>
          <span ng-click="toggleSort($index);sortReverse=false">+</span> 
          Total 
          <span ng-click="toggleSort($index);sortReverse=true">-</span>
        </th>
        <th ng-repeat="challenge in scores.challenges">
          <span ng-click="toggleSort($index);sortReverse=false">X</span> 
          Challenge n° 
          <span ng-click="toggleSort($index);sortReverse=true">Y</span>
        </th>
      </tr>
      <tbody ng-repeat="score in scores | orderObjectBy:sortType:sortReverse">
        <tr>
          <td>{{ $index+1 }}</td>
          <td>{{ score.total }}</td>
          <td ng-repeat="challenge in score.challenges">{{ challenge.point }}</td>
        </tr>
      </tbody>
    </table>
</div>

JSFiddle


谢谢!

【问题讨论】:

  • 所有分数的挑战都一样?

标签: angularjs sorting filter html-table ng-repeat


【解决方案1】:

我更新了小提琴。当您想按嵌套值排序时,这是您指定 orderString 的方式(在您的情况下,它将按特定的挑战 ID):

$scope.orderType = "challenges."+challengeId+'.point';

我还添加了一个过滤器,用于转换数组中的对象:

.filter('orderObjectBy', function() {
  return function (items, field, reverse) {
    var filtered = [];

    angular.forEach(items, function(item, key) {
      item.key = key;
      filtered.push(item);
    });

    return filtered;
  };
});

那么你的 html 应该是这样的:

<tbody ng-repeat="score in scores| orderObjectBy | orderBy: orderType:sortReverse">
    <tr>
     <td>{{ $index+1 }}</td>
     <td>{{ score.total }}</td>
     <td ng-repeat="challenge in score.challenges">{{ challenge.point }}</td>
    </tr>
</tbody>

检查此工作示例:http://jsfiddle.net/Lvc0u55v/13564/

【讨论】:

  • 好的,在这种情况下它可以工作,但实际上变量 $scope.scores 是动态的(来自数据库)所以这一行必须是动态的,我们不知道索引 [6] ng-repeat="(key,challenge) in scores[6].challenges"
  • 这就是为什么我问所有分数的挑战是否相同,即使它们是动态变化的。您可以通过添加分数对象中的第一个对象来设置数组挑战(一旦您从服务器获得响应)。并用 Object.keys(Scores[first_index]) 设置它
猜你喜欢
  • 1970-01-01
  • 2019-05-13
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 2019-01-27
  • 2017-07-12
相关资源
最近更新 更多