【问题标题】:AngularJS orderBy - Multiple fields, but only one reversedAngularJS orderBy - 多个字段,但只有一个反转
【发布时间】:2025-12-08 04:15:01
【问题描述】:

我正在尝试基于两个变量进行过滤,即分数和名称(首先是分数,然后是名称)。

这适用于各种比赛,包括比分可能倒序的比赛(例如高尔夫)和得分正常的比赛(例如足球)。

我目前拥有的代码是:

<span ng-repeat="sel in pot.sels | orderBy:['score','name']:CompCtrl.isReverse()">

这里的问题是,如果分数需要,名称也会颠倒。我试图让 name 永远不会被布尔值反转,但 score 是 (isReverse() 检查是否游戏是反向计分游戏)。

通读我能找到的所有内容,如果不创建自定义过滤器来处理这个问题,这似乎是不可能的。这是正确的还是我错过了这样做的方法?

考虑这个问题的最佳方法是,简单来说,我需要以下内容:

Boolean = true --> -score, name

Boolean = false --> 分数,名称

谢谢。

【问题讨论】:

  • orderBy 文档有一个很好的例子。你可能想看看它。
  • 嗨尼克,我不确定这是在文档中的哪个位置?最后一个示例一次只订购一个字段,我试图一次订购两个。

标签: javascript angularjs angularjs-filter angular-filters angularjs-orderby


【解决方案1】:

我会使用自定义函数过滤器,如下所示:

<span ng-repeat="sel in pot.sels | orderBy:[orderScore,'name']">

哪里的js是这样的:

angular.module('yourModule').controller('MyCtrl',['$scope',function($scope){
    $scope.orderScore = function(el){
        return (isReverse() ? '-' : '+') + el.score;
    }
}]);

我没有对此进行测试,但为了向您展示这个想法,我只需要找到一种方法来返回可以用

排序的东西

【讨论】:

  • 您好,感谢您的回复,我了解您正在尝试做什么,因此将修改代码,看看我能想出什么。您发布的解决方案顺序是 0,然后是 1,然后是 2,等等。结果是一个列表,例如:0,0,0,1,11,13,2,23,3,4,45,54,... .
  • 更新我的第一篇文章,反过来它最终为 -10, -14, -15, -2, -4, -6, 0, 0, 0, 1, 13, 4, 6
  • 很容易修复,用vm.isReverse() ? el.score * -1 : el.score * 1替换return
  • 标记为答案,因为我不知道如何将 sel 传递给 orderBy 变量中定义的函数(这是 orderBy b>el 部分进来)。再加上自定义代码,为我指明了正确的方向。
  • 很高兴对您有所帮助;)