2013-06-12 48 views
28

下令让我们假设我有这种形式的以下数据数组:AngularJs - ngOptions:如何通过组名称,然后通过标签

var data = [{group:GroupA, label: BB}, {group:GroupB, label: DD}.....]. 

我的结合会是这样的:

<select data-ng-options="c as c.label group by c.group for c in data"></select> 

我希望下拉列表在GroupB之前列出所有与GroupA的项目,同时让它们也在每个组下排序。

就是这样。

GroupA 
AA 
BB 
CC 

GroupB 
DD 
EE 
FF 

我知道我可以使用orderBy Angular过滤器,但那并不是真正按我需要的方式工作。我的猜测是我必须编写一个自定义过滤器,以我想要的方式手动排序,但是我想知道是否有更简单的方法来完成任务。

回答

46

orderBy可以采取多个参数的数组来排序。所以,你可以这样做:

c as c.label group by c.group for c in data | orderBy:['group','label'] 

Here is a fiddle

+0

谢谢。我没有意识到你可以将一个数组传递给orderBy。猜猜我忽略了angularjs文档中的那个部分。但至少我知道有一种更简单的方法,因为这将是一个非常常见的用例。 –

+1

你可以使用这种方法指定排序顺序吗?即我想按组asc排序然后标签desc? –

+7

@RossJones是的,你可以将'['group','label']'改成'['+'''''''''''' – sh0ber

1

看起来好像orderBy会像你想要的一样工作。

只要看看你的表情,并添加排序依据底:

c as c.label group by c.group for c in data | orderBy:'label' 

这将首先命令data阵列由每个项目的label属性的值,然后将它们分组。由于数据将被正确排序,因此每个组都会显示正确排序。

Here's a fiddle.

注意初始阵列是如何在向后顺序定义,但每一组中的选择的正确排序。

+0

,其实也不能保证A组B组之前,如果你有A组只包含“GG,HH,II”,该命令将反转。我想我举了一个不好的例子。 :P。我实际上可以通过首先按组进行排序来获得此功能,如果两个组相同,则按标签值排序。 –