2017-04-17 88 views
0

可以说我有对象的一个​​这样的数组:如何自定义排序然后在angularjs中进行排序?

[ 
     { 
      name: 'test1', 
      status: 'pending', 
      date: 'Jan 17 2017 21:00:23' 
     }, 
     { 
      name: 'test2', 
      status: 'pending', 
      date: 'Jan 14 2017 21:00:23' 
     }, 
     { 
      name: 'test3', 
      status: 'active', 
      date: 'Jan 10 2017 21:00:23' 
     } 
    ]; 

我首先要基于“状态”,其中所有“待定”子状态的项目应该来之前,“主动”来排序。 (我还有其他状态,所以orderBy名称DESC将无法正常工作。)

后来我想根据日期降序对它们进行分类。

在我的角度剧本我都定义为一个的SortField变量:

$scope.sortField = ['status', '-date']; 

(不工作,因为活动被整理等待做之前),我有这个在我的html:

<li ng-repeat="form in forms | orderBy:sortField:isAsc " class="row {{Contextual}}" style="margin-bottom: 2px;"> 
    ... 
</li> 

我一直在尝试在线搜索,但无法获取任何地方。你如何自定义排序一个字段“状态”和正常排序另一个“日期”?

+0

即'$ scope.sortField =状态之前使用负[ '-status', '-date']; ' – Ladmerc

+0

@Ladmerc不会工作,因为我也有其他状态,并且Pending不是最后一个。我也被推迟为其中一个状态。 – 90abyss

+0

我看到了,所以不管其他人,等待应始终是第一个? – Ladmerc

回答

0

orderBy过滤器使用表达式来计算顺序。您可以传递一个字符串或函数作为表达式。另外,你可以传递一个数组作为表达式,你的数组可以包含字符串/函数谓词。

这就是说,你可以定义你的自定义排序功能,并通过在阵列中:

<li ng-repeat="form in forms | orderBy: [statusOrder, '-date']"> 

控制器:

$scope.statusOrder = function(item) { 
    if (item.status === 'pending') { 
    return 1; // smaller value means this should be placed first 
    } else { 
     return 2; // all other statuses not 'pending' should be returned as is 
    } 
} 

编辑

关于日期的顺序不正确,由于日期是字符串,所以Angular按字母顺序对日期进行排序。您有两种选择:

  1. 更新您的数组源,以便日期字符串变成日期对象。这是更高性能的$范围明智。

    angular.forEach($scope.array, function(item) { item.date = new Date(item.date) })

  2. 创建自定义dateSort功能像你一样的状态。该函数应该简单地return new Date(item.date)

更新小提琴: https://jsfiddle.net/51bsbzL0/258/

+0

感谢您的回复Ladmerc。我看到状态订单工作正常。但是里面的日期没有在状态组中排序。 – 90abyss

相关问题