2015-02-08 43 views
0

看来,当我在ng-repeat内部使用orderBy过滤器时,为了按某些属性按字母顺序排列对象数组,我得到的结果是错误的。 具体而言,orderBy首先放置所有以重音符号(如Ά,Έ,Ή,Ί等)开头的字符串,忽略它们在字母表中的位置。 在我的例子,我创建的对象AngularJS ng-repeat orderby无法正确使用希腊语单词

$scope.words = [ 
{id: 1, name: "Αντώνης"}, 
{id: 2, name: "Ίκαρος"}, 
{id: 3, name: "Έλλη"}, 
{id: 4, name: "Βασίλης"}, 
{id: 5, name: "Γιάννης"}, 
{id: 6, name: "Δημήτρης"}, 
{id: 7, name: "Ζήσης"}, 
{id: 8, name: "Ηρακλής"}, 
{id: 9, name: "Θανάσης"}, 
]; 

的数组,并使用了NG-重复指令创建一个列表:我得到

<div ng-repeat="w in words | orderBy:'name'">{{w.name}}</div> 

的排序结果为:

Έλλη, Ίκαρος, Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Ζήσης, Ηρακλής, Θανάσης 

虽然正确的将是:

Αντώνης, Βασίλης, Γιάννης, Δημήτρης, Έλλη, Ζήσης, Ηρακλής, Θανάσης, Ίκαρος 

看小提琴here

反正有纠正这种行为吗?我怎样才能创建我自己的orderBy过滤器?

+0

你可以提供你自己的谓词/比较函数orderBy filer。请参阅https://code.angularjs.org/1.3.7/docs/api/ng/filter/orderBy – lujcon 2015-02-08 12:27:08

回答

1

我知道您的文字在重音时没有正确排序。

你可以使用地图删除所有的口音,并使用服务像这样的:

.factory('diacritics',['diacriticsMap',function(diacriticsMap){//should inject diacriticsMap 
var removeDiacritics=function (str) { 
     var letters = str.split(""); 
     var newStr = ""; 
     for(var i=0; i< letters.length; i++) { 
      newStr += letters[i] in diacriticsMap ? diacriticsMap[letters[i]] : letters[i]; 
     } 
     return newStr; 
    }; 
return { 
    remove:removeDiacritics 
}; 

,其中地图是这样的一个常数:

constant('diacriticsMap',{ "A":"A", "Ⓐ":"A", "A":"A", "À":"A", ... })

你可以然后排序非重音词,这肯定会起作用。

+0

我实际上有一张地图,其中包含所有不同字母的字母,但我没有看到将整个字母包含在内的要点我的答案。但是,如果您选择此选项,我可以通过其他方式将其发送给您 – Manube 2015-02-08 13:56:33

+0

我使用了类似的方法来解决此问题。我创建了一个用正常字母替换重音字母的过滤器,以及一个用作orderBy函数并使用过滤器的控制器方法。 [小提琴](http://jsfiddle.net/fincher64/mn98twm7/3/) – user1173403 2015-02-08 14:36:23