【问题标题】:Angularjs orderBy is not working correctlyAngularjs orderBy 无法正常工作
【发布时间】:2016-11-23 06:50:19
【问题描述】:

我已经修改了 angularjs 文档中给出的示例。我在该示例中为所有年龄字段设置了零,当我单击年龄排序按钮时,列表正在排序(不知道列表基于哪个参数进行排序),尽管所有年龄字段都为零并且不应该是排序。

Plunker:https://plnkr.co/edit/85dmPRFu6IPhHnTkXqgU?p=preview

查看:

<div ng-controller="ExampleController">
      <pre>Sort by = {{propertyName}}; reverse = {{reverse}}</pre>
      <hr />
      <button ng-click="propertyName = null; reverse = false">Set to unsorted</button>
      <hr />
      <table class="friends">
        <tbody>
          <tr>
            <th>
              <button ng-click="sortBy('name')">Name</button>
              <span class="sortorder" ng-show="propertyName === 'name'" ng-class="{reverse: reverse}"></span>
            </th>
            <th>
              <button ng-click="sortBy('phone')">Phone Number</button>
              <span class="sortorder" ng-show="propertyName === 'phone'" ng-class="{reverse: reverse}"></span>
            </th>
            <th>
              <button ng-click="sortBy('age')">Age</button>
              <span class="sortorder" ng-show="propertyName === 'age'" ng-class="{reverse: reverse}"></span>
            </th>
          </tr>
          <tr ng-repeat="friend in friends | orderBy:propertyName:reverse">
            <td>{{friend.name}}</td>
            <td>{{friend.phone}}</td>
            <td>{{friend.age}}</td>
          </tr>
        </tbody>
      </table>
    </div>

控制器:

.controller('ExampleController', ['$scope', function($scope) {
    var friends = [
      {name: 'John',   phone: '555-1212',  age: 0},
      {name: 'Mary',   phone: '555-9876',  age: 0},
      {name: 'Mike',   phone: '555-4321',  age: 0},
      {name: 'Adam',   phone: '555-5678',  age: 0},
      {name: 'Julie',  phone: '555-8765',  age: 0}
    ];

    $scope.propertyName = 'age';
    $scope.reverse = true;
    $scope.friends = friends;

    $scope.sortBy = function(propertyName) {
      $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
      $scope.propertyName = propertyName;
    };
  }

【问题讨论】:

  • 所有年龄字段都是0,所以它会按照给定的数组顺序排序。而 reverse 将是给定数组的相反顺序

标签: javascript angularjs angularjs-orderby


【解决方案1】:

在后台 angularjs 使用 this function:

function doComparison(v1, v2) {
  for (var i = 0, ii = predicates.length; i < ii; i++) {
    var result = compare(v1.predicateValues[i], v2.predicateValues[i]);
    if (result) {
      return result * predicates[i].descending * descending;
    }
  }

  return compare(v1.tieBreaker, v2.tieBreaker) * descending;
}

由于您的 v1v2 始终相同,compare(v1.tieBreaker, v2.tieBreaker) 将始终返回相同的值 -1(因为 v1.value 等于 v2.value 使用了 tieBreaker),而 descending变量将是-11,具体取决于排序顺序。这就是角度变化顺序的原因。

如果你不想在这个过滤器中使用sortOrder

friend in friends | orderBy:propertyName:reverse

或没有改变是每次点击这里:

$scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;

顺序不会改变。

【讨论】:

  • 那么有什么办法可以改变这种行为吗?
  • 由于您无法更改 angular.js 源代码中的任何内容,如果数组的所有值的 propertyName 相等,则您必须不更改 reverse,或者提供您的自定义 @987654337 @比较器
  • 谢谢。我在更改 $scope.reverse 值之前添加了一个检查。
  • @SateeshKumarAlli,不客气,你可以接受我的回答
【解决方案2】:

输出背后的实际原因是,当您点击年龄过滤器时,数据将不再排序。它以控制器中声明的确切顺序显示您的$scope.friends

【讨论】:

  • 它只在第一次点击时显示确切的顺序。第一次点击后顺序会发生变化。
【解决方案3】:

正如@Maximus 所建议的,我在将$scope.reverse 的值切换为真或假之前添加了一个检查。

$scope.sortBy = function(propertyName) {

      $scope.propertyName = propertyName;
     // check all the values of propertyName i.e. age in the array
     for (var i=0; i < friends.length; i++) {
        // toggle $scope.reverse only when the values are not same (zero in my case)
        if (friends[i].age !== 0) {
            $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
        }
    }
    };

https://plnkr.co/edit/vMira2iF94yuOqJw3gA7?p=preview

【讨论】:

  • 你能把它作为一个单独的问题发布吗?你可能会在这个问题上得到更多的意见,而不仅仅是我。我已经回答了为什么会这样的问题。我可能没有足够的知识来建议如何解决它。
  • 提问的时候可以在这里链接
猜你喜欢
  • 1970-01-01
  • 2020-01-10
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多