編集中に現在の順序を固定できます。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」の現在の順序を覚えておきたいと思います。
そして最後に、その新しいプロパティ「pos」でソートするようにangularに指示すると、編集中にそのプロパティが変更されないため、テーブルの順序が固定されます。
編集が終わったら、反対のことをしなければなりません。スコープ変数「savedOrder」と「savedReverse」から古い順序を復元します。
$scope.endEdit = function() {
$scope.orderBy = savedOrderBy;
$scope.reverse = reverse;
};
$scope.items 配列の順序が重要な場合は、元の順序に再度並べ替える必要があります。