2013-01-24 7 views
1

Angular "짐바브웨"다음에 "올랑 군도"가 정렬됩니다. 이 문제를 세계적으로 해결하고 싶습니다. 사용자 지정 정렬 함수를 작성하고 모든 orderBy 필터에 지정하는 대신, 필자는 어떻게 든 기본 정렬 함수를 전역 적으로 패치하려고합니다. 이것이 가능한가?각도 정렬 수정

먼저 정상화하여 다음과 같은 기능을 가진 두 문자열이 문제가 해결되었습니다 내가 바라고 있어요

function norm(str) { 
    str = str.toLowerCase(); 
    str = str.replace(/\\s/g, ""); 
    str = str.replace(/[àáâãäå]/g, "a"); 
    str = str.replace(/æ/g, "ae"); 
    str = str.replace(/ç/g, "c"); 
    str = str.replace(/[èéêë]/g, "e"); 
    str = str.replace(/[ìíîï]/g, "i"); 
    str = str.replace(/ñ/g, "n"); 
    str = str.replace(/[òóôõö]/g, "o"); 
    str = str.replace(/œ/g, "oe"); 
    str = str.replace(/[ùúûü]/g, "u"); 
    str = str.replace(/[ýÿ]/g, "y"); 
    str = str.replace(/\\W/g, ""); 
    return str; 
} 

이 각도에서 한 번에 할 수있는 방법이다 다시 그것에 대해 걱정하지 마십시오.

+4

[맞춤 필터] (http://docs.angularjs.org/guide/dev_guide.templates.filters.creating_filters)를 만드시겠습니까? "betterOrderBy"라고해도됩니까? –

+0

나는 angularjs가 javascript 네이티브 비교 연산자를 사용한다고 생각합니다. – Tosh

+0

@MarkRajcok, 좋은 생각입니다. 이 비교 픽스를 제외하고는'betterOrderBy'는'orderBy'와 똑같이 동작하는 한 완벽합니다. –

답변

5

당신은 스스로를 정상화 할 수

<li ng-repeat="item in items | orderBy:normalizedName">{{item.name}}</li> 

여기 plunker에 전체 예입니다.

+0

Vojta, 이렇게하면 정렬 순서에 영향을 미치기 쉽기 때문에 글로벌 방식으로 처리 할 필요가 없습니다. –

3

질문에 대한 의견에 따라 맞춤 필터를 만드십시오. 해 orderBy 이미 무엇을 복제하지 않는이 사용자 정의 필터로 해 orderBy 필터를 주입 다음과 같이

angular.module('myApp', []). 
filter('betterOrderBy', function(orderByFilter) { 
    return function(input, arg1, arg2) { 
     var copy_of_input = angular.copy(input) 
     for (var i = 0; i < input.length; i++) { 
      copy_of_input[i]['orig'] = input[i]; 
      str = copy_of_input[i][arg1].toLowerCase(); 
      str = str.replace(/[àáâãäå]/g, "a"); 
      // ... 
      copy_of_input[i][arg1] = str.replace(/\\W/g, ""); 
     } 
     var normalized_sorted = orderByFilter(copy_of_input, arg1, arg2); 
     var normalized_sorted_orig = []; 
     angular.forEach(normalized_sorted, function(obj, i) { 
      normalized_sorted_orig.push(obj.orig) 
     }) 
     return normalized_sorted_orig; 
    } 
}); 

그것을 사용

Better sort: {{myArrayOfObjects | betterOrderBy:'name'}} 

Fiddle합니다.

var normalize = function(str) { 
    return str.toLowerCase(). 
      replace(/[àáâãäå]/g, "a"); 
      // ... 
}; 

app.controller('MainCtrl', function($scope) { 
    $scope.items = [ 
    {name: 'Åland Islands'}, 
    // ... 
    ]; 

    $scope.normalizedName = function(item) { 
    return normalize(item.name); 
    }; 
}); 

을 그리고 HTML에서 사용 :

+2

배열의 내용을 "orderBy"로 변경 하시겠습니까? 기분이 예기치 않은 부작용이있을 수 있습니다 –

+0

@ 리비 우, 좋은 지적. 먼저 복사본을 만든 다음 복사본을 사용하도록 코드를 변경했습니다. –

+0

답변 해 주셔서 감사합니다. @MarkRajcok. 이 필터는 정렬 목적뿐 아니라 출력에서도 이름을 더 낮게 끝내는 것처럼 보입니다. –