2014-01-22 112 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"} 
    ];