您可以在编辑时冻结当前排序。假设您的 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”进行排序,瞧,表格顺序被冻结,因为该属性在编辑时根本不会改变。
完成编辑后,您必须执行相反的操作。您从范围变量“savedOrder”和“savedReverse”恢复旧排序:
$scope.endEdit = function() {
$scope.orderBy = savedOrderBy;
$scope.reverse = reverse;
};
如果 $scope.items 数组的顺序对您很重要,您还必须将其重新排序为原始顺序。