2016-06-17 22 views
6

Próbuję zamówić szereg obiektów przy użyciu funkcji comparator, ale wygląda na to, że funkcja comparator jest całkowicie ignorowana (patrz: angular documentation).Dlaczego filtr "orderBy" AngularJS ignoruje parametr "comparator"?

Używam angularJS 1.5.6.

Oto JSFiddle

HTML:

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.min.js"> 
</script> 
<body ng-app="app" ng-controller="ctrl"> 
    {{msg}} 
</body> 

JavaScript:

angular.module("app", []) 

.factory('f1', function($filter) { 

    var f1 = {}; 

    function comparator(a,b) { console.log(a,b); return a.id - b.id; } 
    function getter(x) { /*console.log(x);*/ return x; } 

    f1.testOrderBy = function() { 
     return $filter('orderBy')(
      [ {id:3}, {id:1}, {id:2} ], 
      getter, 
      false, 
      comparator 
     ) 
     .map(function(x) { return x.id; }) 
    }; 

    return f1; 
}) 

.controller("ctrl", function($scope, f1) { 
    $scope.msg = f1.testOrderBy(); 
}) 

moje pytanie: Dlaczego comparator ignorowane? (Można to zauważyć, ponieważ wywołanie console.log() nigdy nie jest wykonywane). Czy to jest błędny błąd JS?

Z tego powodu nie mogę nawet zamówić tablicy obiektów przy użyciu niestandardowego komparatora.

Dzięki!

+1

zaskakująco przykład plunkera, który dali na stronie, również nie działa, jak wyjaśniono w dokumentacji https://plnkr.co/edit/FSq6AwlpdCRmTEQ7hefL?p=preview – Deep

+0

Wielki połów Deep! Nawet tego nie zauważyłem! – Floris

Odpowiedz

11

Ponieważ obsługa niestandardowych komparatorów w orderBy została dodana w 1.5.7.

Możesz przeczytać dziennik zmian here.

Jeśli zaznaczysz documentation dla 1.5.6 widać, że API jest opisany jako:

$filter('orderBy')(array, expression, reverse) 

Choć w 1.5.7 to:

$filter('orderBy')(collection, expression, reverse, comparator) 
+0

Dzięki tasseKATT. Nawet nie wiem, co powiedzieć. RTCFM. – Floris

+0

Nie ma za co! Nie czuj się źle, wielu popełniło podobne błędy, w tym ja :) – tasseKATT