Angularjs orderBy 工作不正常
Angularjs orderBy is not working correctly
我修改了 angularjs 文档中给出的示例。我在该示例中为所有年龄字段设置了零,当我单击年龄排序按钮时,列表正在排序(不知道列表是根据哪个参数排序的),尽管所有年龄字段都为零并且不应该是已排序。
Plunker: https://plnkr.co/edit/85dmPRFu6IPhHnTkXqgU?p=preview
查看:
<div ng-controller="ExampleController">
<pre>Sort by = {{propertyName}}; reverse = {{reverse}}</pre>
<hr />
<button ng-click="propertyName = null; reverse = false">Set to unsorted</button>
<hr />
<table class="friends">
<tbody>
<tr>
<th>
<button ng-click="sortBy('name')">Name</button>
<span class="sortorder" ng-show="propertyName === 'name'" ng-class="{reverse: reverse}"></span>
</th>
<th>
<button ng-click="sortBy('phone')">Phone Number</button>
<span class="sortorder" ng-show="propertyName === 'phone'" ng-class="{reverse: reverse}"></span>
</th>
<th>
<button ng-click="sortBy('age')">Age</button>
<span class="sortorder" ng-show="propertyName === 'age'" ng-class="{reverse: reverse}"></span>
</th>
</tr>
<tr ng-repeat="friend in friends | orderBy:propertyName:reverse">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</tbody>
</table>
</div>
控制器:
.controller('ExampleController', ['$scope', function($scope) {
var friends = [
{name: 'John', phone: '555-1212', age: 0},
{name: 'Mary', phone: '555-9876', age: 0},
{name: 'Mike', phone: '555-4321', age: 0},
{name: 'Adam', phone: '555-5678', age: 0},
{name: 'Julie', phone: '555-8765', age: 0}
];
$scope.propertyName = 'age';
$scope.reverse = true;
$scope.friends = friends;
$scope.sortBy = function(propertyName) {
$scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
$scope.propertyName = propertyName;
};
}
引擎盖下 angularjs 使用 this function:
function doComparison(v1, v2) {
for (var i = 0, ii = predicates.length; i < ii; i++) {
var result = compare(v1.predicateValues[i], v2.predicateValues[i]);
if (result) {
return result * predicates[i].descending * descending;
}
}
return compare(v1.tieBreaker, v2.tieBreaker) * descending;
}
由于您的 v1
和 v2
始终相同,因此 compare(v1.tieBreaker, v2.tieBreaker)
将始终 return 相同的值 -1
(因为 v1.value
等于 v2.value
使用 tieBreaker),而 descending
变量将是 -1
或 1
,具体取决于排序顺序。这就是 angular 改变顺序的原因。
如果您不在此过滤器中使用 sortOrder
:
friend in friends | orderBy:propertyName:reverse
或每次点击这里都没有改变:
$scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
顺序不会改变。
你的输出背后的实际原因是当你点击年龄过滤器时,数据将不再排序。它按照控制器中声明的保存顺序显示您的 $scope.friends
。
正如@Maximus 所建议的,我在将 $scope.reverse
的值切换为 true 或 false 之前添加了一个检查。
$scope.sortBy = function(propertyName) {
$scope.propertyName = propertyName;
// check all the values of propertyName i.e. age in the array
for (var i=0; i < friends.length; i++) {
// toggle $scope.reverse only when the values are not same (zero in my case)
if (friends[i].age !== 0) {
$scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
}
}
};
我修改了 angularjs 文档中给出的示例。我在该示例中为所有年龄字段设置了零,当我单击年龄排序按钮时,列表正在排序(不知道列表是根据哪个参数排序的),尽管所有年龄字段都为零并且不应该是已排序。
Plunker: https://plnkr.co/edit/85dmPRFu6IPhHnTkXqgU?p=preview
查看:
<div ng-controller="ExampleController">
<pre>Sort by = {{propertyName}}; reverse = {{reverse}}</pre>
<hr />
<button ng-click="propertyName = null; reverse = false">Set to unsorted</button>
<hr />
<table class="friends">
<tbody>
<tr>
<th>
<button ng-click="sortBy('name')">Name</button>
<span class="sortorder" ng-show="propertyName === 'name'" ng-class="{reverse: reverse}"></span>
</th>
<th>
<button ng-click="sortBy('phone')">Phone Number</button>
<span class="sortorder" ng-show="propertyName === 'phone'" ng-class="{reverse: reverse}"></span>
</th>
<th>
<button ng-click="sortBy('age')">Age</button>
<span class="sortorder" ng-show="propertyName === 'age'" ng-class="{reverse: reverse}"></span>
</th>
</tr>
<tr ng-repeat="friend in friends | orderBy:propertyName:reverse">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</tbody>
</table>
</div>
控制器:
.controller('ExampleController', ['$scope', function($scope) {
var friends = [
{name: 'John', phone: '555-1212', age: 0},
{name: 'Mary', phone: '555-9876', age: 0},
{name: 'Mike', phone: '555-4321', age: 0},
{name: 'Adam', phone: '555-5678', age: 0},
{name: 'Julie', phone: '555-8765', age: 0}
];
$scope.propertyName = 'age';
$scope.reverse = true;
$scope.friends = friends;
$scope.sortBy = function(propertyName) {
$scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
$scope.propertyName = propertyName;
};
}
引擎盖下 angularjs 使用 this function:
function doComparison(v1, v2) {
for (var i = 0, ii = predicates.length; i < ii; i++) {
var result = compare(v1.predicateValues[i], v2.predicateValues[i]);
if (result) {
return result * predicates[i].descending * descending;
}
}
return compare(v1.tieBreaker, v2.tieBreaker) * descending;
}
由于您的 v1
和 v2
始终相同,因此 compare(v1.tieBreaker, v2.tieBreaker)
将始终 return 相同的值 -1
(因为 v1.value
等于 v2.value
使用 tieBreaker),而 descending
变量将是 -1
或 1
,具体取决于排序顺序。这就是 angular 改变顺序的原因。
如果您不在此过滤器中使用 sortOrder
:
friend in friends | orderBy:propertyName:reverse
或每次点击这里都没有改变:
$scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
顺序不会改变。
你的输出背后的实际原因是当你点击年龄过滤器时,数据将不再排序。它按照控制器中声明的保存顺序显示您的 $scope.friends
。
正如@Maximus 所建议的,我在将 $scope.reverse
的值切换为 true 或 false 之前添加了一个检查。
$scope.sortBy = function(propertyName) {
$scope.propertyName = propertyName;
// check all the values of propertyName i.e. age in the array
for (var i=0; i < friends.length; i++) {
// toggle $scope.reverse only when the values are not same (zero in my case)
if (friends[i].age !== 0) {
$scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;
}
}
};