2014-01-22 53 views
1

我遇到了用於創建自定義orderBy過濾器的正確語法的問題。如果需要一個參數(該項目在ng-repeat中迭代器),我沒有問題。你如何傳遞第二個參數。我曾嘗試過:AngularJs自定義orderBy有兩個參數

<div ng-repeat="item in items | orderBy:myCustomSort:mySecondParameter"></div> 

但是,如果我在myCustomSort函數中放置一箇中斷,mySecondParameter是未定義的。此外,您還可以通過orderBy反轉訂單,如果是這樣,您將在哪裏粘貼「reverse」參數。

謝謝。

回答

0

我找不到一個解決方案來將其他參數傳遞給排序函數。相反,我只是創建了一個appendItemFilter,它接受了我想在customSort中引用的參數並將其附加到每個項目。然後我可以直接在該項目中引用它。 這樣:

<div ng-repeat="item in items | appendItem:mySecondParameter | orderBy:myCustomSort"></div> 
+0

可以在控制器的$ scope中爲第二個參數聲明一個變量,並將其綁定到視圖上的某種輸入上,而不是向ng-repeat添加額外的參數: $ scope.sortBy = someParamToSortBy; //例如:'price','name'等... 然後,您的自定義orderBy函數可以訪問$ scope.sortBy而不傳入第二個參數。 $ scope.mySortFunction = function(item){ return(item [$ scope.sortBy]); }; – cre8value

1

請看看:http://docs.angularjs.org/api/ng.filter:orderBy。 orderBy過濾器的參數可以是字符串,函數或數組。所以你可以寫:

<div ng-repeat="item in items | orderBy:[myCustomSort,mySecondParameter]"></div> 

按兩個屬性排序你的數據。

作爲一個例子,看到這個小提琴:http://jsfiddle.net/kFHXL/如果你點擊「年齡」,你可以看到數據按名稱排序,然後按年齡排序。

+0

謝謝,但......你一兩場排序的例子是不一樣的帶有參數的customSort功能。當然,我總是閱讀文檔。這個小提琴是我的問題的直接例子:http://jsfiddle.net/4pcbc/。此外,您的示例僞代碼將無法工作......由函數和參數組成的數組。嘗試一下。 –

0

您可以創建自定義過濾器由多個鍵

在你的js文件進行過濾: -

App.filter('multiOrderBy', ["$filter", function ($filter) { 
return function (items, key1, key2) { 
    var newItems = []; 
    if(!items || !items.length) 
     return newItems; 
    function sortKey1(obj) { 
     return obj[key1].toLowerCase(); 
    } 
    function sortKey2(obj) { 
     return obj[key2].toLowerCase(); 
    } 
    if(key1) 
     newItems = $filter('orderBy')(items, sortKey1); 
    if(key2) 
     newItems = $filter('orderBy')(newItems, sortKey2); 
    return newItems; 
    } 
}]); 

在HTML: -

<div ng-repeat="item in items | multiOrderBy: 'name': 'category'"></div> 

在我的案例是: -

$scope.items = [ 
     {"name":"ABC", "category":"Project"}, 
     {"name":"xyz", "category":"Project"}, 
     {"name":"red", "category":"Color"}, 
     {"name":"Blue", "category":"Color"} 
    ]; 

使過濾後陣將是: -

$scope.items = [ 
     {"name":"Blue", "category":"Color"}, 
     {"name":"red", "category":"Color"}, 
     {"name":"ABC", "category":"Project"}, 
     {"name":"xyz", "category":"Project"} 
    ];