在编辑时,您可以冻结当前的排序。假设您的HTML看起来像这样:
<tbody ng-repeat="item in items | orderBy:orderBy:reverse">
<tr ng-click="startEdit()">
<td>{{item.name}}</td>
</tr>
</tbody>
在你的控制器中,你需要编写以下代码:
var savedOrderBy, savedReverse;
$scope.startEdit() = function() {
$scope.items = $filter('orderBy')($scope.items, $scope.orderby, $scope.reverse);
for (var i = 0; i < $scope.items.length; ++i) {
if (i < 9999) {
$scope.items[i]['pos'] = ("000" + i).slice(-4);
}
}
savedOrderBy = $scope.orderBy;
savedReverse = $scope.reverse;
$scope.orderBy = 'pos';
$scope.reverse = false;
};
在用户开始编辑之前,您首先按照它们当前在页面中出现的顺序精确地对当前项目进行排序。通过使用当前排序参数调用orderBy $filter()来实现。
然后,您遍历已排序的项目,并添加一个任意属性(这里是“pos”),并将其设置为当前位置。我使用零填充它,以便位置0002在0011之前排序。也许这不是必要的,我不知道。
通常情况下,您希望记住当前排序方式,在作用域变量“savedOrder”和“savedReverse”中保存。
最后,您告诉Angular按照该新属性“pos”进行排序,voilà表格顺序被冻结,因为该属性在编辑时根本不会改变。
当您完成编辑后,您需要执行相反的操作。从作用域变量“savedOrder”和“savedReverse”中恢复旧的排序方式:
$scope.endEdit = function() {
$scope.orderBy = savedOrderBy;
$scope.reverse = reverse;
};
如果$scope.items数组的顺序对您很重要,那么您还需要将其排序回原始顺序。