複数の並べ替え可能なリストを管理するために、AngularUI 内で Sortable を使用しています。リスト間でアイテムを簡単に移動し、それに応じて対応するモデルを更新できるようになりました。ただし、クエリ フィルターを含めると、次の場合に少し問題が発生します。
- ユーザーが、リストの最初のエントリではないアイテムの検索フィールドを入力しました。
- ユーザーは、フィルター処理された結果の最初の項目をあるリストから別のリストに移動します。
- クエリがクリアされ、最初のリストが表示されるまで、機能しているようです。クエリを適用したときにエントリを移動したように見えますが、クリアした後、フィルター処理されていない配列の最初のエントリが代わりに移動されたことに気付くでしょう。
ドラッグ アンド ドロップするとき、Sortable はフィルターを考慮していないようです。関連する HTML は次のとおりです。
<p>Search: <input ng-model="query" /></p>
<div class="column-wrapper">
<ul ui-sortable="sortableTemplates" ng-model="list1" id="sortable1" class="connectedSortable">
<li ng-repeat="item in list1|filter:query" class="itemBox">{{item.name}}</li>
</ul>
<ul ui-sortable="sortableTemplates" ng-model="list2" id="sortable2" class="connectedSortable">
<li ng-repeat="item in list2|filter:query" class="itemBox">{{item.name}}</li>
</ul>
</div>
そして対応する JS:
var app = angular.module('myApp', ['ui.sortable']);
app.controller('test', function($scope) {
$scope.list1 = [
{name: 'ABC'},
{name: 'DEF'},
{name: 'GHI'}
];
$scope.list2 = [
{name: 'JKL'},
{name: 'MNO'},
{name: 'QRS'}
];
$scope.sortableTemplates = {
connectWith: '.connectedSortable'
}
});
問題を再現するには、 を検索してから list2GHI
に移動してみてください。GHI
次に、検索ボックスをクリアします。ABC
実際に list2 に移動するのは (その配列の最初の要素であるため)、GHI
リスト 1 に残ります。
リスト間でソートするときに元のインデックスが保持されるように、ソート可能な Angular フィルターを使用する方法はありますか?
(私は Angular と JQueryUI を初めて使用するので、答えは明白かもしれません。同様の質問を見つけましたが、この問題に直接対処しているようには見えませんでした。)