2015-02-08 77 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