我是AngularJS的新手,但到目前为止,我已经能够把头包裹在一切之中。但OrderBy给我带来了问题。我还没有找到像我这样的问题。我有一种感觉,因为我错过了关于$ scope以及orderBy实际工作的方法。
我正在创建一个列表,该列表将显示我所在地区的作者NaNoWriMo。我已将用户分隔为工厂,并将其显示出来。但是,我在解决这些问题时遇到了问题。名称和Wordcount排序没有问题。但计算平均字数完全没有排序。它甚至没有称之为我为它做过的功能。
这是我的简化版面,以及JSFiddle setup (updated)。
JS:
(function () {
var app = angular.module('userList', []);
app.controller('ListController', ['$scope',
function ($scope) {
$scope.users = userData;
$scope.day = 30;
$scope.avgWords = function (user) {
return Math.floor(user.wordcount / $scope.day);
};
$scope.sort = "name";
$scope.sortRev = false;
$scope.sortChange = function (field) {
if ($scope.sort === field) {
$scope.sortRev = !$scope.sortRev;
return;
}
$scope.sort = field;
$scope.sortRev = false;
};
$scope.sortAvg = function (user) {
alert("sorted!");
return Math.floor(user.wordcount / $scope.day);
};
}]);
var userData = [{
"name": "Kris",
"wordcount": 42382
}, {
"name": "Tim",
"wordcount": 60120
}, {
"name": "Elsa",
"wordcount": 150675
}];
})();
HTML:
<div ng-controller="ListController">
<table>
<thead>
<tr>
<th ng-click="sortChange('name');">Username</th>
<th ng-click="sortChange('wordcount');">Total Words</th>
<th ng-click="sortChange('sortAvg');">Average WPD</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="user in users | orderBy:sort:sortRev">
<td>{{user.name}}</td>
<td>{{user.wordcount}}</td>
<td>{{avgWords(user)}}</td>
</tr>
</tbody>
</table>
答案 0 :(得分:2)
您始终只需将平均单词属性添加到作用域上用户数组中的对象即可。这样每个列都可以通过适当的属性进行过滤......所以类似
http://jsfiddle.net/poppypoop/swer05sx/
$scope.users = userData;
$scope.day = 30;
for(var i=0; i < $scope.users.length; i++){
$scope.users[i].avgWords = Math.floor($scope.users[i].wordcount / $scope.day);
}
答案 1 :(得分:1)
当您点击Average WPD标题时,您将$ scope.sort设置为字符串&#34; avgWords&#34;。因此,orderBy使用此字符串对用户进行排序,从而按照avgWords
字段的值对用户进行排序,该字段始终为undefined
。
如果要使用自定义函数而不是字段进行排序,则必须将$scope.sort
设置为要排序的函数:
$scope.sort = $scope.avgWords;
要做到这一点,标题上的ng-click应为
sortChange(avgWords)