Angular.jsでng-repeatの内容をドラッグ&ドロップで入れ替えられるようにしてみます。
サンプルコード
ui-sortableを使用します。
jQueryとjQuery UIも必要になるので、合わせて読み込ませるようにしてください。
1 2 3 4 | < script src = "sortable.min.js" ></ script > |
HTML
入れ替えを行う要素の親要素にui-sortableとng-modelを指定します。
1 2 3 4 5 | < div ng-controller = "ctrl" > < ul ui-sortable ng-model = "items" > < li ng-repeat = "item in items" >{{ item }}</ li > </ ul > </ div > |
JavaScript
1 2 3 4 | var myAppModule = angular.module( 'app' , [ 'ui.sortable' ]) myAppModule.controller( 'ctrl' , function ($scope) { $scope.items = [ 'クザク' , 'ランタ' , 'ハルヒロ' , 'ユメ' , 'メリイ' , 'シホル' ]; }); |
ng-repeatをドラッグ&ドロップで入れ替えのデモページ
オプションの設定
HTML
オプションを設定する場合、ui-sortableに値を指定します。
1 2 3 4 5 | < div ng-controller = "ctrl" > < ul ui-sortable = "sortableOptions" ng-model = "items" > < li ng-repeat = "item in items" >{{ item }}</ li > </ ul > </ div > |
JavaScript
ui-sortableに指定した値(sortableOptions)にオプションを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | var myAppModule = angular.module( 'app' , [ 'ui.sortable' ]) myAppModule.controller( 'ctrl' , function ($scope, $timeout) { $scope.items = [ 'クザク' , 'ランタ' , 'ハルヒロ' , 'ユメ' , 'メリイ' , 'シホル' ]; $scope.sortableOptions = { axis: 'y' , // 縦方向のみの移動にする cursor: 'move' , // カーソルの変更 update: function () { // 移動後に発火 $timeout( function () { console.log($scope.items); }); } }; }); |
オプション設定のデモページ
オプションについて詳しくは、jQuery UIのSortable Widgetのオプションをご確認ください。
ドラッグ&ドロップの対象を変更する
移動する要素はliのままで、ドラッグ&ドロップの対象要素をli内の一部にしてみます。
HTML
.handleを対象にしてみます。
1 2 3 4 5 | < div ng-controller = "ctrl" > < ul ui-sortable = "sortableOptions" ng-model = "items" > < li ng-repeat = "item in items" >< div class = "handle" ></ div >{{ item }}</ li > </ ul > </ div > |
CSS
1 2 3 4 5 6 7 8 | .handle { display : inline-block ; width : 30px ; height : 30px ; vertical-align : middle ; margin-right : 5px ; background : #666666 ; } |
JavaScript
オプションのhandleを設定します。
1 2 3 4 5 6 7 | var myAppModule = angular.module( 'app' , [ 'ui.sortable' ]) myAppModule.controller( 'ctrl' , function ($scope, $timeout) { $scope.items = [ 'クザク' , 'ランタ' , 'ハルヒロ' , 'ユメ' , 'メリイ' , 'シホル' ]; $scope.sortableOptions = { handle: '.handle' }; }); |
スマートフォンに対応する
jQuery UI Touch Punchを使用します。
基本的には読み込みにjQuery UI Touch Punchを追加するだけで大丈夫なはずです。
1 | < script src = "jquery.ui.touch-punch.min.js" ></ script > |
【参考サイト】
- AngularJSで、リストをドラック&ドロップで入れ替える為のメモ – Qiita
- [AngularJS] UI.Sortable を使ったドラッグ&ドロップ UI の構築 | Developers.IO
- Sortable Widget | jQuery UI API Documentation
- iPhone/iPadでjQuery UIのsortable,resizeableなどに対応する | RaQoolスタッフブログ
コメントが承認されるまで時間がかかります。