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;
}

Angular で一度これを行う方法があれば、二度と心配する必要はありません。

4

2 に答える 2

5

自分で正規化できます:

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で使用します:

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

plunkerの例全体を次に示します。

于 2013-02-28T18:05:14.833 に答える
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'}}

フィドル

于 2013-01-24T21:21:34.760 に答える