Angular.jsでng-repeatの内容をドラッグ&ドロップで入れ替えられるようにしてみます。
サンプルコード
ui-sortableを使用します。
jQueryとjQuery UIも必要になるので、合わせて読み込ませるようにしてください。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script> <script src="sortable.min.js"></script>
HTML
入れ替えを行う要素の親要素にui-sortableとng-modelを指定します。
<div ng-controller="ctrl">
<ul ui-sortable ng-model="items">
<li ng-repeat="item in items">{{ item }}</li>
</ul>
</div>
JavaScript
var myAppModule = angular.module('app', ['ui.sortable'])
myAppModule.controller('ctrl', function($scope) {
$scope.items = ['クザク', 'ランタ', 'ハルヒロ', 'ユメ', 'メリイ', 'シホル'];
});
ng-repeatをドラッグ&ドロップで入れ替えのデモページ
オプションの設定
HTML
オプションを設定する場合、ui-sortableに値を指定します。
<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)にオプションを設定します。
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を対象にしてみます。
<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
.handle {
display: inline-block;
width: 30px;
height: 30px;
vertical-align: middle;
margin-right: 5px;
background: #666666;
}
JavaScript
オプションのhandleを設定します。
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を追加するだけで大丈夫なはずです。
<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スタッフブログ
コメントが承認されるまで時間がかかります。