angularjs orderBy有多个函数,如何反转?

前端之家收集整理的这篇文章主要介绍了angularjs orderBy有多个函数,如何反转?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ng-repeat迭代一组对象,需要一些函数提取我想要排序的值.

我的ng-repeat看起来像这样:

  1. ng-repeat="row in rows | orderBy: [sortFnOne,sortFnTwo,...]"

我遇到麻烦的是,我希望sortFnOne被颠倒过来.这些是提取我无法使用简单属性访问的字符串,因为它正在对数据进行一些转换以生成我尝试排序的这些值.

如果它很简单,我知道我会这样做:

  1. ng-repeat="row in rows | orderBy: ['-id','name','-status',...]"

如果这些功能只是返回布尔我可以!获取我想要的结果的返回值,但其中一些是返回字符串,有些是以YYYY-MM-DD格式返回日期.

我自己也遇到过这个限制……没有办法用orderBy过滤器来反转函数完成的排序.

据我所知,没有简单的方法可以在原生JavaScript API中重现这种带方向的复合排序(按’A’升序然后’B’降序排序).

Array.prototype.sort通过比较函数提供基本排序(有关详细信息,请参阅MDN docs),但无法在不编写其他比较函数的情况下轻松切换排序顺序(反向),并且它不提供复合排序的解决方案.我们需要的是一个紧凑的表示法来指定多个排序的方向和优先级.

前段时间我写了这个助手来帮助解决这个问题.

  1. var orderByAgeThenName = new OrderByBuilder().asc(getAge).asc(getName).build();
  2. var friendsByAgeThenName = orderByAgeThenName(friends);
  3.  
  4. var orderByNameThenAge = new OrderByBuilder().desc(getName).asc(getAge).build();
  5. var friendsByNameThenAge = orderByNameThenAge(friends);

这不是角度过滤器,因此只需将其包装在控制器方法中并从模板中调用它即可.或者,只需将顺序应用于控制器内的阵列即可.

我想这可以适应角度过滤器……

可运行样本:

  1. angular.module('orderByExample',[])
  2. .controller('ExampleController',['$scope',function($scope) {
  3. var friends =
  4. [{name:'Jon',phone:'555-1212',age:10},{name:'Zach',phone:'555-2276',age:7},phone:'555-9876',age:19},phone:'555-9276',age:13},{name:'Mike',phone:'555-4321',age:21},{name:'Adam',phone:'555-5678',age:35},{name:'Julie',phone:'555-8765',age:29}];
  5.  
  6. function getName(f){
  7. return f.name;
  8. }
  9.  
  10. function getAge(f){
  11. return f.age;
  12. }
  13. var orderByName = new OrderByBuilder().desc(getName).build();
  14. var orderByNameAndAge = new OrderByBuilder().desc(getName).asc(getAge).build();
  15.  
  16. $scope.friendLists = [
  17. {label:'Not Ordered',friends: friends},{label:'Name DESC',friends: orderByName(friends)},{label:'Name DESC,Age ASC',friends: orderByNameAndAge(friends)}
  18. ];
  19. }]);
  20.  
  21.  
  22.  
  23.  
  24. function OrderByBuilder(orderings){
  25. var _orderings = [];
  26.  
  27. return {
  28. asc: function(fn){
  29. addOrdering(true,fn);
  30. return this;
  31. },desc: function(fn){
  32. addOrdering(false,build: build
  33. };
  34.  
  35. function addOrdering(asc,fn){
  36. _orderings.push({
  37. getterFn: fn,asc: asc
  38. });
  39. return this;
  40. }
  41.  
  42. function build(){
  43. var compare = _orderings.reverse().reduce(function(nextComparer,ordering){
  44. return getComparerFn(ordering,nextComparer);
  45. },null);
  46.  
  47. return function(xs){
  48. return xs.slice().sort(compare);
  49. };
  50. }
  51.  
  52. // a comparerFn has the following signature:
  53. // function(a: obj,b: obj): int
  54.  
  55. function getComparerFn(ordering,nextComparer){
  56. var next = nextComparer || function(a,b){ return 0; };
  57. var getVal = ordering.getterFn;
  58.  
  59. return function(a,b){
  60. var aVal = getVal(a);
  61. var bVal = getVal(b);
  62. if(aVal < bVal){ return ordering.asc ? -1 : 1; }
  63. if(aVal > bVal){ return ordering.asc ? 1 : -1; }
  64. return next(a,b);
  65. };
  66. }
  67. }
  1. <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.0-beta.6/angular.min.js"></script>
  2. <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
  3.  
  4. <div ng-app="orderByExample">
  5. <div ng-controller="ExampleController">
  6. <div class="row">
  7. <div ng-repeat="friendList in friendLists" class="col-sm-4">
  8. <h4>{{friendList.label}}</h4>
  9. <table class="table table-bordered table-condensed">
  10. <tr>
  11. <th>Name</th>
  12. <th>Phone Number</th>
  13. <th>Age</th>
  14. </tr>
  15. <tr ng-repeat="friend in friendList.friends">
  16. <td>{{friend.name}}</td>
  17. <td>{{friend.phone}}</td>
  18. <td>{{friend.age}}</td>
  19. </tr>
  20. </table>
  21. </div>
  22. </div>
  23. </div>
  24. </div>

猜你在找的Angularjs相关文章