嵌套数据时的AngularJs表排序
AngularJs Table Sorting when Data is nested
当我的数据是嵌套的,并且不是所有列都是对象的一级公民时,我如何在angularjs中处理表排序。
数据(摘录)
[
{
"name": "Team A",
"categories": [
{
"label": "FG%",
"value": 4676,
"points": 7
},
{
"label": "FT%",
"value": 8387,
"points": 9
}
]
}, {
"name": "Team B",
"categories": [
{
"label": "FG%",
"value": 5285,
"points": 10
},
{
"label": "FT%",
"value": 6111,
"points": 1
}
]
}
]
HTML
<div ng-controller="mainCtrl">
<table class="table table-striped table-condensed">
<thead>
<tr>
<th ng:click="changeSorting('name')">Name</th>
<th ng:click="changeSorting('name')">Points</th>
<th ng:click="changeSorting(value.label)" ng-repeat="(index, value) in data.teams[0].categories">{{value.label}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="team in data.teams | orderBy:sort.column:sort.descending ">
<td>{{team.name}}</td>
<td>{{team.totalPoints}}</td>
<td ng-repeat="(name, cat) in team.categories">
{{cat.value}}
</td>
</tr>
</tbody>
</table>
</div>
这是我多次发现的一种方法。无论如何,由于我的数据结构,恐怕这不是一个正确的想法。
控制器上的排序
$scope.sort = {
column: 'name',
descending: false
};
$scope.changeSorting = function(column) {
var sort = $scope.sort;
if (sort.column == column) {
sort.descending = !sort.descending;
} else {
sort.column = column;
sort.descending = false;
}
};
这是最新的小提琴:http://jsfiddle.net/SunnyRed/mTywq/2/
我在http://docs.angularjs.org/api/ng.filter:orderBy
HTML
<div ng-controller="mainCtrl">
<table class="table table-striped table-condensed">
<thead>
<tr>
<th ng:click="predicate = 'name'; reverse = !reverse">Name</th>
<th ng:click="predicate = 'totalPoints'; reverse = !reverse">Points</th>
<th ng:click="toggleSort($index)" ng-repeat="category in data.teams[0].categories">{{category.label}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="team in data.teams | orderBy:predicate:reverse">
<td>{{team.name}}</td>
<td>{{team.totalPoints}}</td>
<td ng-repeat="(name, cat) in team.categories">
{{cat.value}}
</td>
</tr>
</tbody>
</table>
</div>
分拣零件
$scope.toggleSort = function(index){
$scope.reverse = !$scope.reverse;
$scope.predicate = function(team){
return team.categories[index].points;
}
}
这是小提琴:http://jsfiddle.net/mgalela/Br5Wb/14/
由于您需要根据其label
查找正确的类别,然后使用其关联的value
进行排序,因此我会创建一个自定义orderBy
函数。
要使用新函数sortFunc
,我们在此处添加它:
<tr ng-repeat="team in data.teams | orderBy: sortFunc ">
然后让用户选择选项:
<select ng-model="sortVal">
<option value="name">Name</option>
<option value="points">points</option>
<option value="3PM">3PM</option>
<option value="PTS">PTS</option>
</select>
最后,这里有一个排序函数,它使用$scope.sortVal
拉入所选的选项,并返回orderBy
的适当值进行排序
$scope.sortFunc = function(val) {
if ($scope.sortVal == 'name') {
return(val.name);
} else if ($scope.sortVal == 'points') {
return(val.totalPoints);
} else if ($scope.sortVal == '3PM' ||
$scope.sortVal == 'PTS') {
for (var i = 0; i < val.categories.length; i++) {
category = val.categories[i];
if (category.label == $scope.sortVal){
return(category.value);
}
}
}
}
这是这项工作的关键:http://jsfiddle.net/mTywq/4/
相关文章:
- AngularJs对所有页面中的所有记录进行排序
- AngularJS:删除重复的对象并按值对数组进行重新排序
- 根据输入文本按元素排序,AngularJS
- AngularJS剑道网格绑定到angular服务webapi-当使用[fromuri]进行解析时,排序总是为null
- 在angularjs或javascript中对hashmap进行排序
- AngularJs orderby 过滤器无法正确排序数据
- 在angularjs ng-repeat指令中对对象进行排序
- AngularJS/Javascript:使用运算符对字符串进行排序
- AngularJS使用对象属性排序多个对象数组
- 根据angularjs中画布上的位置对列表项进行排序
- 如何使用AngularJs或Javascript对数组进行排序
- 在AngularJS中,如何指定辅助排序
- 如何在AngularJS中根据子结果集排序结果
- 如何使用AngularJS而不是在查询子句中根据两列的差异对表进行排序
- 重新排序angularjs ngRepeat与后续数据结果
- AngularJS:使用orderBy进行过滤和排序
- AngularJS typeahead添加了按函数自定义排序
- 迁移到AngularJS 1.2会破坏可排序包装器指令
- 嵌套数据时的AngularJs表排序
- 有条件地排序 - AngularJs