2

問題是我有一個配方對象數組。每個配方對象都有一些註釋。我想使用angular提供的$ filter服務對angularJS控制器中的數組進行排序。AngularJS自定義過濾器orderBy sortPredicate不工作

$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

它可以通過排序依據

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

文檔最終ARG $filter('orderBy')(array, expression, reverse)

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

我敢肯定,你也可以反向設置的範圍VAR如果你想。

+0

哦,它也在工作。傻我。不管怎麼說,還是要謝謝你。其實,我應該顯示計數和配方標題。 –

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

濾波器期望一個表達,不是一個函數。

+0

這是不正確的,它會同時接受,它也會接受一系列的功能。 https://docs.angularjs.org/api/ng/filter/orderBy –

+0

@EdwardKnowles啊,沒有意識到這一點。感謝您的提醒! –