峰澜未语 發表於 2019-11-11 15:38:00

angular实现draggable拖拽

<p>前言:最近项目要实现一个拖拽功能,我在网上开始了各类搜寻,虽然后面因为数据原因舍弃了拖拽的这一需求,但是为了不辜负最近的研究,还是来记录一下。</p>
<p>场景需求:面试预约选时间节点,候选人之间是可以相互交换的,但是局限于面试方向相同的候选人才能相互拖拽(拖拽后即表示两个候选人之间交换面试时间)。本来此种场景上图更为明确,奈何公司只限于内网开发,上传不了图片,嘤嘤嘤。。。</p>
<p>参考文章:https://www.cnblogs.com/starof/p/10662027.html</p>
<p>正文:</p>
<p>draggable是H5新增的属性,true表示可以拖拽,false表示不能拖拽。在拖拽过程中分别有两个元素:被拖动元素与目标元素。</p>
<p>被拖动元素相关的事件:</p>
<ul>
<li>ondragstart:按下鼠标并开始移动时触发该事件。</li>
<li>ondrag:在start事件触发后被触发,并在鼠标移动过程中不停被触发。</li>
<li>ondragend:当拖动停止触发(无论把元素放到拖放目标上还是在无效目标上)</li>
</ul>
<p>目标元素相关的事件:</p>
<ul>
<li>ondragenter:被拖动元素进入目标时触发。</li>
<li>ondragover:被拖动元素在目标元素上移动时被触发。</li>
<li>ondragleave:被拖动元素离开目标时触发,即拖到无效目标时。</li>
<li>ondrop:被拖动元素被放置在目标上时被触发。</li>
</ul>
<p>注意:默认情况下目标元素是不允许被放置的,所以不会触发drop事件。这时需要在ondragover中阻止默认行为才能成为被允许放置的目标。</p>
<p>对于angular、vue等依赖组件开发的框架,最好把draggable封装成指令去实现功能。(实施步骤与参考文章无异,直接上代码啦,其他不赘述)具体步骤:</p>
<p>1.新建directives指令文件夹</p>
<p>2.新建拖拽文件夹directives/drap-drop</p>
<p>3.新建drap指令文件directives/drag-drop/<span style="color: rgba(0, 0, 0, 1)">drag.directive.ts</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">4.新建drop指令文件directives/drag-drop/<span style="color: rgba(0, 0, 0, 1)">drop.directive.ts</span></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">5.因为涉及数据交换,所以要新建一个services来传递数据,directives/directives.services.ts</span></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">6.新建<span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">directives</span></span>/<span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">directives</span></span>.module.ts</span></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">7.在公共模板中引入<span style="color: rgba(0, 0, 0, 1)">DirectiveModule </span></span></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">8.引用</span></span></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">directives.module.ts</span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>import { NgModule } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import { DragDirective } from </span>'./drag-drop/drag.directive'<span style="color: rgba(0, 0, 0, 1)">;
import { DropDirective } from </span>'./drag-drop/drop.directive'<span style="color: rgba(0, 0, 0, 1)">;
import { DragDropService } from </span>'./drag-drop/drag-drop.service'<span style="color: rgba(0, 0, 0, 1)">;
@NgModule({
declarations: ,
exports: ,
providers:
})
export class DirectiveModule { }</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">drag.directive.ts</span></span></span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>import { Directive,HostBinding, HostListener, Host, ElementRef, Renderer2, Input,Output,EventEmitter } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import {DragDropService} from </span>'./drag-drop.service'<span style="color: rgba(0, 0, 0, 1)">;
@Directive({
selector: </span>''<span style="color: rgba(0, 0, 0, 1)">
})
export class DragDirective {
private _isDraggble </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">给标签设置draggable属性
*true-能拖拽
*false-不能拖拽
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Input(</span>'app-draggable'<span style="color: rgba(0, 0, 0, 1)">)
set isDraggable(value:</span><span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)">){
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>._isDraggble=<span style="color: rgba(0, 0, 0, 1)">value;
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.rd.setAttribute(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement,'draggable'<span style="color: rgba(0, 0, 0, 1)">,`${value}`);
}
get isDraggable(){
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._isDraggble;
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拖拽开始时添加的class</span>
<span style="color: rgba(0, 0, 0, 1)">@Input()
draggedClass:string;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给拖拽的元素定义dragTag标识(目标元素也会设置一个标识,用于判断该元素是否能拖到目标元素)</span>
<span style="color: rgba(0, 0, 0, 1)">@Input()
dragTag:any;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给DragDropservice传递的数据(即目标元素的数据)</span>
<span style="color: rgba(0, 0, 0, 1)">@Input()
dragData:any

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断开始/结束拖拽时,部分区域的元素是不能设置为拖拽目标的(给不能拖拽的区域设置背景色)</span>
<span style="color: rgba(0, 0, 0, 1)">@Output()
dragStart </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> EventEmitter&lt;any&gt;<span style="color: rgba(0, 0, 0, 1)">();
@Output()
dragEnd </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> EventEmitter&lt;any&gt;<span style="color: rgba(0, 0, 0, 1)">();

constructor(private el:ElementRef, private rd:Renderer2,private service:DragDropService) { }

@HostListener(</span>'dragstart', ['$event'<span style="color: rgba(0, 0, 0, 1)">])
ondragstart(ev:Event){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断drag元素是不是指令应用的元素发起的</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement===<span style="color: rgba(0, 0, 0, 1)">ev.target){
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.rd.addClass(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement, <span style="color: rgba(0, 0, 255, 1)">this</span>.draggedClass);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">往el上增加一个class</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进入时候给service传递上数据</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.service.setDragData({tag:<span style="color: rgba(0, 0, 255, 1)">this</span>.dragTag,data:<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.dragData});
      ev[</span>'dataTransfer'].setData('tag',<span style="color: rgba(0, 0, 255, 1)">this</span>.dragTag);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">兼容firefox,用来设置拖放操作的drag data到指定的数据和类型</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.dragStart.emit(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.dragTag);
    }

}

@HostListener(</span>'dragend', ['$event'<span style="color: rgba(0, 0, 0, 1)">])
ondragend(ev:Event){
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement===<span style="color: rgba(0, 0, 0, 1)">ev.target){
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.rd.removeClass(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement, <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.draggedClass);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.dragEnd.emit(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.dragTag);
    }
}
}</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">drop.directive.ts</span></span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>import { Directive, HostListener, ElementRef, Renderer2, Input, Output, EventEmitter} from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import { DragDropService, DragData } from </span>'./drag-drop.service'<span style="color: rgba(0, 0, 0, 1)">;
import { take } from </span>'rxjs/operators'<span style="color: rgba(0, 0, 0, 1)">;

@Directive({
selector: </span>''<span style="color: rgba(0, 0, 0, 1)">
})
export class DropDirective {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">拖拽至目标元素时发射的事件</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Output()
dropped </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> EventEmitter&lt;DragData&gt;<span style="color: rgba(0, 0, 0, 1)">();

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">设定目标区域的标识</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Input()
dropTag:any;

private data$;
constructor(private el:ElementRef, private rd:Renderer2,private service:DragDropService) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.data$ = <span style="color: rgba(0, 0, 255, 1)">this</span>.service.getDragData().pipe(take(1<span style="color: rgba(0, 0, 0, 1)">));
}

@HostListener(</span>'dragenter', ['$event'<span style="color: rgba(0, 0, 0, 1)">])
onDragEnter(ev:Event){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断drag元素是不是指令应用的元素发起的</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement===<span style="color: rgba(0, 0, 0, 1)">ev.target){
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.data$.subscribe(dragData=&gt;<span style="color: rgba(0, 0, 0, 1)">{
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(dragData &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span>.dropTag ==<span style="color: rgba(0, 0, 0, 1)"> dragData.tag){
         
      }
      });
    }
}


</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">dragover允许进行data transfer的一些特效</span>
@HostListener('dragover', ['$event'<span style="color: rgba(0, 0, 0, 1)">])
onDragOver(ev:Event){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">需要支持多级拖拽,所以要防止事件冒泡</span>
<span style="color: rgba(0, 0, 0, 1)">    ev.preventDefault();
    ev.stopPropagation();
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement===<span style="color: rgba(0, 0, 0, 1)">ev.target){
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.data$.subscribe(dragData=&gt;<span style="color: rgba(0, 0, 0, 1)">{
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(dragData &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span>.dropTag ==<span style="color: rgba(0, 0, 0, 1)"> dragData.tag){
          </span><span style="color: rgba(0, 0, 255, 1)">this</span>.rd.setProperty(ev,'dataTransfer.effectAllowed','all'<span style="color: rgba(0, 0, 0, 1)">);
          </span><span style="color: rgba(0, 0, 255, 1)">this</span>.rd.setProperty(ev,'dataTransfer.fropEffect','move'<span style="color: rgba(0, 0, 0, 1)">);
      }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
          </span><span style="color: rgba(0, 0, 255, 1)">this</span>.rd.setProperty(ev,'dataTransfer.effectAllowed','none'<span style="color: rgba(0, 0, 0, 1)">);
          </span><span style="color: rgba(0, 0, 255, 1)">this</span>.rd.setProperty(ev,'dataTransfer.dropEffect','none'<span style="color: rgba(0, 0, 0, 1)">);
      }
      });
    }
}

@HostListener(</span>'dragleave', ['$event'<span style="color: rgba(0, 0, 0, 1)">])
onDragLeave(ev:Event){
    ev.preventDefault();
    ev.stopPropagation();
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement===<span style="color: rgba(0, 0, 0, 1)">ev.target){      
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.data$.subscribe(dragData=&gt;<span style="color: rgba(0, 0, 0, 1)">{
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(dragData &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span>.dropTag ==<span style="color: rgba(0, 0, 0, 1)"> dragData.tag){
         
      }
      });
    }

}

@HostListener(</span>'drop', ['$event'<span style="color: rgba(0, 0, 0, 1)">])
onDrop(ev:Event){
    ev.preventDefault();
    ev.stopPropagation();
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.el.nativeElement===<span style="color: rgba(0, 0, 0, 1)">ev.target){
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.data$.subscribe(dragData =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(dragData &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span>.dropTag ==<span style="color: rgba(0, 0, 0, 1)"> dragData.tag){         
          </span><span style="color: rgba(0, 0, 255, 1)">this</span>.dropped.emit(dragData);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">drop的时候把dragData发射出去</span>
          <span style="color: rgba(0, 0, 255, 1)">this</span>.service.clearDragData(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">drop的时候把data clear掉,否则会影响下一次拖拽</span>
<span style="color: rgba(0, 0, 0, 1)">      }
      });
    }

}
}</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">directives.services.ts</span></span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>import { Injectable } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import { Observable,BehaviorSubject } from </span>'rxjs'<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数据结构</span>
<span style="color: rgba(0, 0, 0, 1)">export interface DragData{
tag:string; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">多重拖拽的话是哪一级拖拽,用户自己保证唯一性,不能重复</span>
data:any; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">传递的数据</span>
<span style="color: rgba(0, 0, 0, 1)">}


@Injectable({
providedIn: </span>'root'<span style="color: rgba(0, 0, 0, 1)">
})
export class DragDropService {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用BehaviorSubject总能记住上一次的值</span>
private _dragData = <span style="color: rgba(0, 0, 255, 1)">new</span> BehaviorSubject&lt;DragData&gt;(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
setDragData(data:DragData){
    </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._dragData.next(data);
}

getDragData():Observable</span>&lt;DragData&gt;<span style="color: rgba(0, 0, 0, 1)">{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._dragData.asObservable();
}

clearDragData(){
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>._dragData.next(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
}
constructor() { }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>公共模板common.module.ts中引入<span style="color: rgba(0, 0, 0, 1)">DirectiveModule </span></p>
<div class="cnblogs_code">
<pre>import { NgModule } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import { CommonModule } from </span>'@angular/common'<span style="color: rgba(0, 0, 0, 1)">;
import { FormsModule } from </span>'@angular/forms'<span style="color: rgba(0, 0, 0, 1)">;
import { NgZorroAntdModule} from </span>'../zorro/ng-zorro-antd.module'<span style="color: rgba(0, 0, 0, 1)">;
import {NzPaginationUpComponent} from </span>"./nzPaginationUp.component"<span style="color: rgba(0, 0, 0, 1)">;</span><span style="color: rgba(0, 0, 0, 1)">
import {DirectiveModule} from </span>"./directives/directives.module"<span style="color: rgba(0, 0, 0, 1)">;
@NgModule({
imports: [
    CommonModule,
    FormsModule,
    NgZorroAntdModule,
    DirectiveModule
],
declarations: [
    NzPaginationUpComponent,
   
],
exports: [
    NzPaginationUpComponent,
    DirectiveModule
   
],
   providers:
})
export class CoreFrameCommonModule {

}</span></pre>
</div>
<p>引用:</p>
<p>test.component.html</p>
<div class="cnblogs_code">
<pre>&lt;table&gt;
&lt;tr&gt;
    &lt;td class="b-n-t b-n-l b-n-b b-n-r" width="80"&gt;&lt;/td&gt;
    &lt;td class="b-n-t b-n-l b-n-b" width="50"&gt;&lt;/td&gt;
    &lt;ng-template ngFor let-item ="menuContent.dateArr"&gt;
      &lt;td&gt;{{item.week}}&lt;/td&gt;
    &lt;/ng-template&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class="b-n-t b-n-l b-n-r"&gt;&lt;/td&gt;
    &lt;td class="b-n-t b-n-l"&gt;&lt;/td&gt;
    &lt;ng-template ngFor let-item ="menuContent.dateArr"&gt;
      &lt;td&gt;{{item.date}}&lt;/td&gt;
    &lt;/ng-template&gt;
&lt;/tr&gt;
&lt;tr *ngFor="let group of menuContent"&gt;
    &lt;td&gt;{{group.groupName}}&lt;/td&gt;
    <span style="color: rgba(0, 128, 0, 1)">&lt;!--时间点-start--&gt;</span>
    &lt;td&gt;
      &lt;div class="time-box" *ngFor="let etc of group.dateArr.etc"&gt;
          &lt;ng-template ngFor let-dateItem ="etc.detail"&gt;
            &lt;div class="time-item"&gt;{{dateItem.time}}&lt;/div&gt;
          &lt;/ng-template&gt;
      &lt;/div&gt;
    &lt;/td&gt;
    <span style="color: rgba(0, 128, 0, 1)">&lt;!--时间点-end--&gt;</span>
    <span style="color: rgba(0, 128, 0, 1)">&lt;!--坑-start--&gt;</span>
    &lt;ng-template ngFor let-item0 ="group.dateArr"&gt;
      &lt;td&gt;
      &lt;div class="name-box" ="{'no-drop': dragCurrentDirect &amp;&amp; item1.direct != dragCurrentDirect}" *ngFor="let item1 of item0.etc"&gt;
          &lt;ng-template ngFor let-item2 ="item1.detail"&gt;
            &lt;div class="name-item"&gt;
                &lt;div ="true"<span style="color: rgba(0, 0, 0, 1)">
                  draggedClass</span>="drag-start"<span style="color: rgba(0, 0, 0, 1)">
                  </span>="item2['direct']"<span style="color: rgba(0, 0, 0, 1)">
                  </span>="item2"<span style="color: rgba(0, 0, 0, 1)">
                  (dragStart)</span>="moveStart($event)"<span style="color: rgba(0, 0, 0, 1)">
                  (dragEnd)</span>="moveEnd($event)"<span style="color: rgba(0, 0, 0, 1)">
                  </span>="item2['direct']"<span style="color: rgba(0, 0, 0, 1)">
                  (dropped)</span>="handleMove($event,item2)"&gt;{{item2.name}}&lt;/div&gt;
            &lt;/div&gt;
          &lt;/ng-template&gt;
      &lt;/div&gt;
      &lt;/td&gt;
    &lt;/ng-template&gt;
    <span style="color: rgba(0, 128, 0, 1)">&lt;!--坑-end--&gt;</span>
&lt;/tr&gt;
&lt;/table&gt;</pre>
</div>
<p>test.component.scss</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">.box{
padding:20px;
border:2px solid #ddd;
div{
    margin</span>-<span style="color: rgba(0, 0, 0, 1)">bottom:10px;
    height:100px;
    text</span>-<span style="color: rgba(0, 0, 0, 1)">align:center;
    line</span>-<span style="color: rgba(0, 0, 0, 1)">height:100px;
    background:#fff;
    border</span>-<span style="color: rgba(0, 0, 0, 1)">radius:4px;
}
}
table{
width:800px;
table</span>-<span style="color: rgba(0, 0, 0, 1)">layout:fixed;
border</span>-<span style="color: rgba(0, 0, 0, 1)">collapse:collapse;
background:#fff;
.time</span>-item,.name-<span style="color: rgba(0, 0, 0, 1)">item{
    line</span>-<span style="color: rgba(0, 0, 0, 1)">height:30px;
    height:30px;
    border</span>-bottom:1px solid #999<span style="color: rgba(0, 0, 0, 1)">;
}
.time</span>-box:last-child .time-item:last-child{border-bottom:0<span style="color: rgba(0, 0, 0, 1)">;}
.name</span>-box:last-child .name-item:last-child{border-bottom:0<span style="color: rgba(0, 0, 0, 1)">;}
.name</span>-<span style="color: rgba(0, 0, 0, 1)">item{
    cursor:pointer;
    div{height:30px;}
    .drag</span>-<span style="color: rgba(0, 0, 0, 1)">start{
      color:#fff;
      background:#c8152d;
      opacity:.</span>8<span style="color: rgba(0, 0, 0, 1)">;
      }
}
}
th,td{
border:1px #</span>525152<span style="color: rgba(0, 0, 0, 1)"> solid;
text</span>-<span style="color: rgba(0, 0, 0, 1)">align:center;
line</span>-<span style="color: rgba(0, 0, 0, 1)">height:40px;
}
.no</span>-drop{background-<span style="color: rgba(0, 0, 0, 1)">color:#ddd;}
.b</span>-n-t{border-<span style="color: rgba(0, 0, 0, 1)">top:1px solid transparent}
.b</span>-n-l{border-<span style="color: rgba(0, 0, 0, 1)">left:1px solid transparent}
.b</span>-n-b{border-<span style="color: rgba(0, 0, 0, 1)">bottom:1px solid transparent}
.b</span>-n-r{border-right:1px solid transparent}</pre>
</div>
<p>test.component.ts</p>
<div class="cnblogs_code">
<pre>import { Component, OnInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;

@Component({
selector: </span>'app-test'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./test.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./test.component.scss'<span style="color: rgba(0, 0, 0, 1)">]
})
export class TestComponent implements OnInit {
dragCurrentDirect:string;<span style="color: rgba(0, 128, 0, 1)">//用于判断拖拽的是否是有效的目标</span>
menuContent</span>=<span style="color: rgba(0, 0, 0, 1)">[
    {groupName:</span>'A组'<span style="color: rgba(0, 0, 0, 1)">,dateArr:[
      {week:</span>'星期一',date:'11月4日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'张1',sapId:'001',direct:'C#',boxId:'1'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'张2',sapId:'002',direct:'C#',boxId:'2'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张3',sapId:'003',direct:'C#',boxId:'3'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张4',sapId:'004',direct:'C#',boxId:'4'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张5',sapId:'005',direct:'C#',boxId:'5'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张6',sapId:'006',direct:'C#',boxId:'6'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王1',sapId:'007',direct:'Java',boxId:'7'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王2',sapId:'008',direct:'Java',boxId:'8'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王3',sapId:'009',direct:'Java',boxId:'9'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王4',sapId:'0010',direct:'Java',boxId:'10'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘1',sapId:'0011',direct:'前端',boxId:'11'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘2',sapId:'0012',direct:'前端',boxId:'12'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘3',sapId:'0013',direct:'前端',boxId:'13'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘4',sapId:'0014',direct:'前端',boxId:'14'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘5',sapId:'0015',direct:'前端',boxId:'15'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘6',sapId:'0016',direct:'前端',boxId:'16'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周1',sapId:'0011',direct:'Java',boxId:'17'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'周2',sapId:'0012',direct:'Java',boxId:'18'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周3',sapId:'0013',direct:'Java',boxId:'19'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周4',sapId:'0014',direct:'Java',boxId:'20'<span style="color: rgba(0, 0, 0, 1)">}
      ]}
      ]},
      {week:</span>'星期二',date:'11月5日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'张111',sapId:'0035',direct:'C#',boxId:'21'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'张112',sapId:'0036',direct:'C#',boxId:'22'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张113',sapId:'0037',direct:'C#',boxId:'23'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张114',sapId:'0038',direct:'C#',boxId:'24'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张115',sapId:'0039',direct:'C#',boxId:'25'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张116',sapId:'0040',direct:'C#',boxId:'26'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王111',sapId:'0041',direct:'Java',boxId:'27'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王112',sapId:'0042',direct:'Java',boxId:'28'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王113',sapId:'0043',direct:'Java',boxId:'29'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王114',sapId:'0044',direct:'Java',boxId:'30'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘111',sapId:'0045',direct:'前端',boxId:'31'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘112',sapId:'0046',direct:'前端',boxId:'32'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘113',sapId:'0047',direct:'前端',boxId:'33'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘114',sapId:'0048',direct:'前端',boxId:'34'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘115',sapId:'0049',direct:'前端',boxId:'35'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘116',sapId:'0050',direct:'前端',boxId:'36'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周111',sapId:'0051',direct:'Java',boxId:'37'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'周112',sapId:'0052',direct:'Java',boxId:'38'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周113',sapId:'0053',direct:'Java',boxId:'39'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周114',sapId:'0054',direct:'Java',boxId:'40'<span style="color: rgba(0, 0, 0, 1)">}
      ]}
      ]},
      {week:</span>'星期四',date:'11月7日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'张1111',sapId:'0075',direct:'C#',boxId:'41'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'张1112',sapId:'0076',direct:'C#',boxId:'42'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张1113',sapId:'0077',direct:'C#',boxId:'43'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张1114',sapId:'0078',direct:'C#',boxId:'44'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张1115',sapId:'0079',direct:'C#',boxId:'45'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张1116',sapId:'0080',direct:'C#',boxId:'46'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王1111',sapId:'0081',direct:'Java',boxId:'47'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王1112',sapId:'0082',direct:'Java',boxId:'48'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王1113',sapId:'0083',direct:'Java',boxId:'49'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王1114',sapId:'0084',direct:'Java',boxId:'50'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘1111',sapId:'0085',direct:'前端',boxId:'51'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘1112',sapId:'0086',direct:'前端',boxId:'52'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘1113',sapId:'0087',direct:'前端',boxId:'53'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘1114',sapId:'0088',direct:'前端',boxId:'54'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘1115',sapId:'0089',direct:'前端',boxId:'55'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘1116',sapId:'0090',direct:'前端',boxId:'56'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周1111',sapId:'0091',direct:'Java',boxId:'57'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'周1112',sapId:'0092',direct:'Java',boxId:'58'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周1113',sapId:'0093',direct:'Java',boxId:'59'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周1114',sapId:'0094',direct:'Java',boxId:'60'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      ]},
      {week:</span>'星期五',date:'11月8日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'张11111',sapId:'00205',direct:'C#',boxId:'61'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'张11112',sapId:'00206',direct:'C#',boxId:'62'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张11113',sapId:'00207',direct:'C#',boxId:'63'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张11114',sapId:'00208',direct:'C#',boxId:'64'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张11115',sapId:'00209',direct:'C#',boxId:'65'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张11116',sapId:'00210',direct:'C#',boxId:'66'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王11111',sapId:'00211',direct:'Java',boxId:'67'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王11112',sapId:'00212',direct:'Java',boxId:'68'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王11113',sapId:'00213',direct:'Java',boxId:'69'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王11114',sapId:'00214',direct:'Java',boxId:'70'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘11111',sapId:'00215',direct:'前端',boxId:'71'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘11112',sapId:'00216',direct:'前端',boxId:'72'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘11113',sapId:'00217',direct:'前端',boxId:'73'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘11114',sapId:'00218',direct:'前端',boxId:'74'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘11115',sapId:'00219',direct:'前端',boxId:'75'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘11116',sapId:'00220',direct:'前端',boxId:'76'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周11111',sapId:'00221',direct:'Java',boxId:'77'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'周11112',sapId:'00222',direct:'Java',boxId:'78'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周11113',sapId:'00223',direct:'Java',boxId:'79'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周11114',sapId:'00224',direct:'Java',boxId:'80'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      ]}
    ]},
    {groupName:</span>'B组'<span style="color: rgba(0, 0, 0, 1)">,dateArr:[
      {week:</span>'星期一',date:'11月4日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'',sapId:'',direct:'C#',boxId:'81'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'',sapId:'',direct:'C#',boxId:'82'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张13',sapId:'0017',direct:'C#',boxId:'83'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张14',sapId:'0018',direct:'C#',boxId:'84'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张15',sapId:'0019',direct:'C#',boxId:'85'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张16',sapId:'0020',direct:'C#',boxId:'86'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王11',sapId:'0021',direct:'Java',boxId:'87'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王12',sapId:'0022',direct:'Java',boxId:'88'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王13',sapId:'0023',direct:'Java',boxId:'89'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王14',sapId:'0024',direct:'Java',boxId:'90'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘11',sapId:'0025',direct:'前端',boxId:'91'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘12',sapId:'0026',direct:'前端',boxId:'92'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘13',sapId:'0027',direct:'前端',boxId:'93'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘14',sapId:'0028',direct:'前端',boxId:'94'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘15',sapId:'0029',direct:'前端',boxId:'95'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘16',sapId:'0030',direct:'前端',boxId:'96'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周11',sapId:'0031',direct:'Java',boxId:'97'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'',sapId:'',direct:'Java',boxId:'98'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周13',sapId:'0033',direct:'Java',boxId:'99'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周14',sapId:'0034',direct:'Java',boxId:'100'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      ]},
      {week:</span>'星期二',date:'11月5日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'张1111',sapId:'0055',direct:'C#',boxId:'101'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'张1112',sapId:'0056',direct:'C#',boxId:'102'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张1113',sapId:'0057',direct:'C#',boxId:'103'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张1114',sapId:'0058',direct:'C#',boxId:'104'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张1115',sapId:'0059',direct:'C#',boxId:'105'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张1116',sapId:'0060',direct:'C#',boxId:'106'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王1111',sapId:'0061',direct:'Java',boxId:'107'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王1112',sapId:'0062',direct:'Java',boxId:'108'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王1113',sapId:'0063',direct:'Java',boxId:'109'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王1114',sapId:'0064',direct:'Java',boxId:'110'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘1111',sapId:'0065',direct:'前端',boxId:'111'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘1112',sapId:'0066',direct:'前端',boxId:'112'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘1113',sapId:'0067',direct:'前端',boxId:'113'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘1114',sapId:'0068',direct:'前端',boxId:'114'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘1115',sapId:'0069',direct:'前端',boxId:'115'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘1116',sapId:'0070',direct:'前端',boxId:'116'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周1111',sapId:'0071',direct:'Java',boxId:'117'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'周1112',sapId:'0072',direct:'Java',boxId:'118'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周1113',sapId:'0073',direct:'Java',boxId:'119'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周1114',sapId:'0074',direct:'Java',boxId:'120'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      ]},
      {week:</span>'星期四',date:'11月7日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'张11111',sapId:'0095',direct:'C#',boxId:'121'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'张11112',sapId:'0096',direct:'C#',boxId:'122'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张11113',sapId:'0097',direct:'C#',boxId:'123'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张11114',sapId:'0098',direct:'C#',boxId:'124'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张11115',sapId:'0099',direct:'C#',boxId:'125'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张11116',sapId:'00100',direct:'C#',boxId:'126'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王11111',sapId:'00101',direct:'Java',boxId:'127'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王11112',sapId:'00102',direct:'Java',boxId:'128'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王11113',sapId:'00103',direct:'Java',boxId:'129'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王11114',sapId:'00104',direct:'Java',boxId:'130'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘11111',sapId:'00105',direct:'前端',boxId:'131'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘11112',sapId:'00106',direct:'前端',boxId:'132'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘11113',sapId:'00107',direct:'前端',boxId:'133'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘11114',sapId:'00108',direct:'前端',boxId:'134'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘11115',sapId:'00109',direct:'前端',boxId:'135'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘11116',sapId:'00200',direct:'前端',boxId:'136'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周11111',sapId:'00201',direct:'Java',boxId:'137'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'周11112',sapId:'00202',direct:'Java',boxId:'138'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周11113',sapId:'00203',direct:'Java',boxId:'139'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周11114',sapId:'00204',direct:'Java',boxId:'140'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      ]},
      {week:</span>'星期五',date:'11月8日'<span style="color: rgba(0, 0, 0, 1)">,etc:[
      {direct:</span>'C#'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'8:00',name:'张111111',sapId:'00225',direct:'C#',boxId:'141'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:00',name:'张111112',sapId:'00226',direct:'C#',boxId:'142'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'8:40',name:'张111113',sapId:'00227',direct:'C#',boxId:'143'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:00',name:'张111114',sapId:'00228',direct:'C#',boxId:'144'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:20',name:'张111115',sapId:'00229',direct:'C#',boxId:'145'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'9:40',name:'张111116',sapId:'00230',direct:'C#',boxId:'146'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'10:00',name:'王111111',sapId:'00231',direct:'Java',boxId:'147'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'10:20',name:'王111112',sapId:'00232',direct:'Java',boxId:'148'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:00',name:'王111113',sapId:'00233',direct:'Java',boxId:'149'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'11:20',name:'王111114',sapId:'00234',direct:'Java',boxId:'150'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'前端'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'13:40',name:'刘111111',sapId:'00235',direct:'前端',boxId:'151'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:20',name:'刘111112',sapId:'00236',direct:'前端',boxId:'152'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'14:40',name:'刘111113',sapId:'00237',direct:'前端',boxId:'153'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:00',name:'刘111114',sapId:'00238',direct:'前端',boxId:'154'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:20',name:'刘111115',sapId:'00239',direct:'前端',boxId:'155'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'15:40',name:'刘111116',sapId:'00240',direct:'前端',boxId:'156'<span style="color: rgba(0, 0, 0, 1)">}
      ]},
      {direct:</span>'Java'<span style="color: rgba(0, 0, 0, 1)">,detail:[
            {time:</span>'16:00',name:'周111111',sapId:'00241',direct:'Java',boxId:'157'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:20',name:'周111112',sapId:'00242',direct:'Java',boxId:'158'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'16:40',name:'周111113',sapId:'00243',direct:'Java',boxId:'159'<span style="color: rgba(0, 0, 0, 1)">},
            {time:</span>'17:00',name:'周111114',sapId:'00244',direct:'Java',boxId:'160'<span style="color: rgba(0, 0, 0, 1)">}
      ]}
      ]}
    ]}
]
constructor() { }

ngOnInit() {
}
moveStart(directname){
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.dragCurrentDirect =<span style="color: rgba(0, 0, 0, 1)"> directname;
}
moveEnd(directname){
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.dragCurrentDirect = ''<span style="color: rgba(0, 0, 0, 1)">;
}
handleMove(fromData,toData){
    let oldItem </span>=<span style="color: rgba(0, 0, 0, 1)"> JSON.parse(JSON.stringify(fromData.data));
    let newItem </span>=<span style="color: rgba(0, 0, 0, 1)"> JSON.parse(JSON.stringify(toData));
    console.log(fromData,toData);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.menuContent.forEach(item0=&gt;<span style="color: rgba(0, 0, 0, 1)">{
      item0.dateArr.forEach(item1</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
            item1.etc.forEach(item2</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
                item2.detail.forEach(item3</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span>(oldItem.boxId ==<span style="color: rgba(0, 0, 0, 1)"> item3.boxId){
                        item3.sapId </span>=<span style="color: rgba(0, 0, 0, 1)"> newItem.sapId;
                        item3.name </span>=<span style="color: rgba(0, 0, 0, 1)"> newItem.name;
                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span>(newItem.boxId ==<span style="color: rgba(0, 0, 0, 1)"> item3.boxId){
                        item3.sapId </span>=<span style="color: rgba(0, 0, 0, 1)"> oldItem.sapId;
                        item3.name </span>=<span style="color: rgba(0, 0, 0, 1)"> oldItem.name;
                  }
                })
            })
      })
    })
}
}</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/myyouzi/p/11835471.html
頁: [1]
查看完整版本: angular实现draggable拖拽