2

Проблема в том, что у меня есть массив объектов рецептов. У каждого объекта рецепта есть некоторые комментарии к нему. Я хочу сортировать массив в контроллере angularJS, используя службу $ filter, предоставляемую угловыми.AngularJS Custom Filter orderBy sortPredicate not working

$scope.recipes = $filter('orderBy')($scope.data, function(recipe) { 
    return recipe.comments.length; 
    }); 

Но это не дает требуемых результатов. Тем не менее, я смог добиться желаемых результатов с помощью функции массива сортировки JS, как этого

$scope.data.sort(function(a, b) { 
    if (a.comments.length < b.comments.length) return 1; 
    if (b.comments.length < a.comments.length) return -1; 
    return 0; 
    }); 

Plunkr для того же сценария является: http://plnkr.co/edit/L9Bt67xHRCJLBoWG8EZp?p=preview

Спасибо заранее. Пожалуйста помоги!

ответ

3

Это можно сделать намного проще, используя OrderBy

http://plnkr.co/edit/B0fMi7FotgmG2tkCjySt?p=preview

<ul> 
    <li ng-repeat="r in recipes | orderBy:'-comments.length'"> 
    {{r.title}} - {{r.comments.length}} 
    </li> 
</ul> 
+0

Спасибо. Но я хочу сделать это только в контроллере. Есть ли выход и для этого? –

+0

Хорошо, я с тобой. Тогда да. Я добавил еще один ответ: поскольку оба ответа делают то же самое, другие могут найти это полезным. –

0

Добавлено это как еще один ответ, так как вы хотите управлять ею в контроллере, и вы хотите, наоборот, добавить true как окончательный аргумент в $filter

Документация $filter('orderBy')(array, expression, reverse)

Пример

$scope.recipes = $filter('orderBy')($scope.data, function(recipe) { 
    return recipe.comments.length; 
}, true); 

Я уверен, что вы также можете установить обратный к вар в области видимости, если вы хотите.

+0

О, это тоже работало. Дурак я. Спасибо, в любом случае. На самом деле, я должен был отобразить подсчеты вместе с названиями рецептов. –

0
$scope.recipes = $filter('orderBy')($scope.data, "comments.length", true) 

Фильтр ожидает выражение, а не функция.

+0

Это неверно, он будет принимать оба, он также примет множество функций. https://docs.angularjs.org/api/ng/filter/orderBy –

+0

@EdwardKnowles Ах, не знал об этом. Спасибо за хедз-ап! –