最近項目上遇到需要拖拽的需求,於是就在github上找了一些相關組件,最后看中了ng2-drag-drop和ng2-dragula,但是ng2-drag-drop組件本身拖拽的時候不支持拖拽元素放在拖拽目標的任意位置,只能放置在拖拽目標那一列的最后。所以最后使用了ng2-dragula。
github地址:https://github.com/valor-software/ng2-dragula
需求如下圖:可以添加新的欄目,可以刪除(刪除時需要判斷此欄目下是否有上架的圖書),拖拽紅色框區域可以移動到其他地方,每列二級欄目超過5個則不能拖拽其他欄目進來,每個欄目(含一級和二級)可以雙擊編輯。
一、安裝
npm install ng2-dragula --save
二、在module文件引入DragulaModule
1 import { DragulaModule } from 'ng2-dragula'; 2
3 @NgModule({ 4 imports: [ 5 DragulaModule, 6 ], 7 })
三、引入主要的css
css位置:node_modules/dragula/dist/dragula.css。
主要樣式如下:
1 .gu-mirror{position: fixed ; margin: 0 ; z-index: 9999 ; opacity: 0.8; }
2 .gu-hide{display: none ;}
3 .gu-unselectable{-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;}
4 .gu-transit{opacity: 0.2;}
四、使用
HTML中,可以使用指令[dragula]='"dragulaBag"' ,dragula是設置可以拖放的區域,如果所有container都不設置,那默認是所有區域都可以拖放;如果設置不一樣的,那么只可以在dragula相同的區域相互拖拽。
還可以使用[dragulaModel]='xx',<ul [dragulaModel]='items'> <li *ngFor="let item of items"></li> </ul>如果有拖拽,items的值會自動修改,保存時直接提交items數據即可,非常方便。
也可以自己設置[dragulaOptions]="options",options有一些默認的設置,如默認所有區域可以拖拽,默認拖拽時不可以copy,我們可以根據需求自己任意修改。
1 部分代碼如下: 2 <div class="container" [dragula]='"dragulaBag"' [dragulaModel]='list1' 3 [dragulaOptions]="options" (mouseover)="onMouseover(0)" (mouseout)="onMouseout(0)"> 4 <div *ngFor="let lev_2 of list1;let i =index" [class.boxBg]="list1"> 5 <div class="lev_2_li"> 6 <i class="lev_2_drag"> 7 </i> 8 <input class="lev_2_input" type="text" maxlength="30" placeholder="二級分類(必填)" 9 [tlEditFocus]="lev_2.selected" [hidden]="!lev_2.selected" [(ngModel)]="lev_2.name"> 10 <a class="lev_2_name" title="{{lev_2.name}}" (dblclick)="onEdit(lev_2)" 11 [hidden]="lev_2.selected"> 12 {{lev_2.name}} 13 </a> 14 <span class="lev_2_delete" (click)="onDelete(list1,i)"> 15 </span> 16 </div> 17 </div> 18 </div>
設置每列滿5個則不可以拖拽,以及紅色框部分出發拖拽,都可以通過重新設置options,ts代碼如下:
1 public options = { 2 accepts: (el, target, source, sibling) = >{ 3 if (target.children.length >= 5) { 4 return false; 5 } 6 return true; 7 }, 8 moves: function(el, container, handle) { 9 return handle.className === 'lev_2_drag'; 10 } 11 };
(本文原創,轉載請注明出處!!)