orderBy
- [email protected]
ng
模块中的过滤器
使用表达式的谓词为数组排序。对字符串使用字母顺序进行排序,数字则按数字的大小排序。
注意:如果你发现数字不是按照你的预期进行排序的,请确定他们被保存的实际形式确实为数字而不是字符串。
用法
HTML 模板绑定中
{{ orderBy_expression | orderBy : expression : reverse}}
JavaScript 中
$filter('orderBy')(array, expression, reverse)
参数
参数 | 形式 | 详细 |
---|---|---|
array | array |
需要排序的数组 |
expression | string function(*) Array.<function(*)>= Array.<string>= |
用于比较来确定元素顺序的谓词。 可以为以下之一: - function :Getter 函数.这个函数返回的结果会使用 < ,=== ,> 操作符进行排序。- string :一个 Angular 表达式。表达式解析用来比较元素。(举个例子,表达式为 name ,则以 name 属性进行排序,表达式为 name.substr(0, 3) ,则以 name 属性的值的前3个字符进行排序)。一个常量表达式解析的结果会被当做属性名而被用于比较(例如:"special name"就会使用他们的 special name 属性进行排序)。一个表达式可以通过设置 + 或 - 前缀来控制排序(升序或降序)方式(例如:+name 或 -name )。如果没有提供属性(例如:'+'; 译:仅仅规定了升序)则会用数组元素本身来进行排序。- Array : 一个函数、字符串谓词组成的数组,第一个谓词用于排序,当两项相等时,则用下一个谓词排序。如果不传入谓词或者为空则默认为 '+' |
reverse(可选) | boolean |
翻转数组的顺序 |
返回
string
经过排序数组的复制品
例子
下面的例子展示了一个简单的 ngRepeat
,数据通过 age
来降序排列(谓词设置成了 -age
)。
翻转(reverse)没有设置,默认不生效(false)
index.html
<script>
angular.module('orderByExample', [])
.controller('ExampleController', ['$scope', function($scope) {
$scope.friends =
[{name:'John', phone:'555-1212', age:10},
{name:'Mary', phone:'555-9876', age:19},
{name:'Mike', phone:'555-4321', age:21},
{name:'Adam', phone:'555-5678', age:35},
{name:'Julie', phone:'555-8765', age:29}];
}]);
</script>
<div ng-controller="ExampleController">
<table class="friend">
<tr>
<th>Name</th>
<th>Phone Number</th>
<th>Age</th>
</tr>
<tr ng-repeat="friend in friends | orderBy:'-age'">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</table>
</div>
谓词和翻转参数可以通过作用域(scope)属性动态地控制。下面的例子将展示。
index.html
<script>
angular.module('orderByExample', [])
.controller('ExampleController', ['$scope', function($scope) {
$scope.friends =
[{name:'John', phone:'555-1212', age:10},
{name:'Mary', phone:'555-9876', age:19},
{name:'Mike', phone:'555-4321', age:21},
{name:'Adam', phone:'555-5678', age:35},
{name:'Julie', phone:'555-8765', age:29}];
$scope.predicate = 'age';
$scope.reverse = true;
$scope.order = function(predicate) {
$scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;
$scope.predicate = predicate;
};
}]);
</script>
<style type="text/css">
.sortorder:after {
content: '\25b2';
}
.sortorder.reverse:after {
content: '\25bc';
}
</style>
<div ng-controller="ExampleController">
<pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
<hr/>
[ <a href="" ng-click="predicate=''">unsorted</a> ]
<table class="friend">
<tr>
<th>
<a href="" ng-click="order('name')">Name</a>
<span class="sortorder" ng-show="predicate === 'name'" ng-class="{reverse:reverse}"></span>
</th>
<th>
<a href="" ng-click="order('phone')">Phone Number</a>
<span class="sortorder" ng-show="predicate === 'phone'" ng-class="{reverse:reverse}"></span>
</th>
<th>
<a href="" ng-click="order('age')">Age</a>
<span class="sortorder" ng-show="predicate === 'age'" ng-class="{reverse:reverse}"></span>
</th>
</tr>
<tr ng-repeat="friend in friends | orderBy:predicate:reverse">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</table>
</div>
当然也可以手动地调用 orderBy
过滤器。注入 $filter
服务,使用如 $filter('orderBy')
这样来检索排序的过滤器,
然后调用 $filter('orderBy')
返回的结果,并传入参数。
index.html
<div ng-controller="ExampleController">
<table class="friend">
<tr>
<th><a href="" ng-click="reverse=false;order('name', false)">Name</a>
(<a href="" ng-click="order('-name',false)">^</a>)</th>
<th><a href="" ng-click="reverse=!reverse;order('phone', reverse)">Phone Number</a></th>
<th><a href="" ng-click="reverse=!reverse;order('age',reverse)">Age</a></th>
</tr>
<tr ng-repeat="friend in friends">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</table>
</div>
script.js
angular.module('orderByExample', [])
.controller('ExampleController', ['$scope', '$filter', function($scope, $filter) {
var orderBy = $filter('orderBy');
$scope.friends = [
{ name: 'John', phone: '555-1212', age: 10 },
{ name: 'Mary', phone: '555-9876', age: 19 },
{ name: 'Mike', phone: '555-4321', age: 21 },
{ name: 'Adam', phone: '555-5678', age: 35 },
{ name: 'Julie', phone: '555-8765', age: 29 }
];
$scope.order = function(predicate, reverse) {
$scope.friends = orderBy($scope.friends, predicate, reverse);
};
$scope.order('-age',false);
}]);