2013-10-15 56 views
0

我想使用Angularjs按字母顺序拆分国家/地区列表。 有点像A:美国,澳大利亚B:巴西,不丹... 该名单来自一个名为国家的表。我试图在国名的第一个字母表上应用angularjs过滤器,但失败了。我必须为它创建一个自定义过滤器吗?使用Angularjs按字母顺序将国家拆分列表

+1

你想在哪里使用那个?一些带有下拉列表的文本框? –

+0

像这样(http://www.infoplease.com/countries.html#ALPHA-A) – firangi

+0

控制器中的数据是什么样的?它来自服务吗?一个jsfiddle或一些代码显示你已经尝试过会有所帮助。 – thebenedict

回答

2

好吧我要回答我自己的问题,最终得到它的工作。 我在下面的格式拉动的国家名单从一个Postgres数据库:

{"alpha2":"ao","alpha3":"ago","numeric":"024","country":"Angola"} 

我想分裂国家的名单按字母顺序是这样的:

[例] http://infoplease.com/countries.html#ALPHA-A

我终于得到它通过编写自定义过滤器的工作:

angular.module('countryFilter', []).filter('cfilter', function() { 
return function(input,x) { 
var groups = []; 
for(var i = 0; i < input.length; i++) { 
if (input[i].country.substring(0,1) == x) 
groups.push(input[i]); 
} return groups; } 
}); 

,并用它作为:

ng-repeat="data in countries | cfilter:'A' 
{{data.country}} 

不要让我知道是否有这样做没有更好的办法...

+0

很好的解决方案,我注意到自定义过滤器内的代码被执行两次,虽然 - 这是一个正常的行为angularjs? –

1

这是不使用过滤器 http://www.bennadel.com/blog/2456-Grouping-Nested-ngRepeat-Lists-In-AngularJS.htm

的另一种可能的解决方案,他创建了一个新的数组标签和数据。优点是在模板中,您不必命名所有可能的字母。

对于我自己,我从对象中取出客户端的第一个字母,并将其存储在标签中。这样我只能得到我使用的字母。

在客户中,我用对象存储了一个数组。

for(var i = 0; i < customers.length; i++){ 

    var customer = customers[i]; 


    if(customer[ 'title' ].substring(0,1) !== groupValue){ 

     var group = { 
     label : customer[ 'title' ].substring(0,1), 
     customers : [] 

     }; 

     groupValue = customer.title.substring(0,1); 
     groups.push(group); 

    }; 


    group.customers.push(customer); 
    };