当前位置: 首页
前端开发
Angular7实现拖放DragDrop示例详解

Angular7实现拖放DragDrop示例详解

热心网友 时间:2026-06-13
转载

拖放功能实践:Angular 7 CDK 拖拽排序完整指南 Angular 7 CDK 中新增的拖放模块,让列表元素的拖动与排序变得非常直观。本文将用一个完整的实战示例,逐步拆解拖放功能的实现全过程。第一步非常简单:安装所需的依赖包。 npm install @angular cdk --sa ve

拖放功能实践:Angular 7 CDK 拖拽排序完整指南

Angular 7 CDK 中新增的拖放模块,让列表元素的拖动与排序变得非常直观。本文将用一个完整的实战示例,逐步拆解拖放功能的实现全过程。第一步非常简单:安装所需的依赖包。

npm install @angular/cdk --sa ve

\

导入拖放模块到 app.module.ts

安装完成后,按照 Angular 的惯例,首先需要将 DragDropModule 引入到 app.module.ts 的 imports 数组中,以便在整个应用中启用拖放功能。

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule , RoutingComponent} from './app-routing.module';
import { AppComponent } from './app.component';
import { NewCmpComponent } from './new-cmp/new-cmp.component';
import { ChangeTextDirective } from './change-text.directive';
import { SqrtPipe } from './app.sqrt';
import { MyserviceService } from './myservice.service';
import { HttpClientModule } from '@angular/common/http';
import { ScrollDispatchModule } from '@angular/cdk/scrolling';
import { DragDropModule } from '@angular/cdk/drag-drop';
@NgModule({
   declarations: [
      SqrtPipe,
      AppComponent,
      NewCmpComponent,
      ChangeTextDirective,
      RoutingComponent
   ],
   imports: [
      BrowserModule,
      AppRoutingModule,
      HttpClientModule,
      ScrollDispatchModule,
      DragDropModule
   ],
   providers: [MyserviceService],
   bootstrap: [AppComponent]
})
export class AppModule { }

注意,DragDropModule 需要从 @angular/cdk/drag-drop 路径导入,并且必须正确添加到 imports 数组中,这是使用拖放功能的前提。

准备数据源:myservice.service.ts

接下来,我们需要准备一个数据源。这里使用现成的服务,通过 HTTP 请求从 JSONPlaceholder 获取用户数据,模拟真实项目中的动态数据加载。

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
   providedIn: 'root'
})
export class MyserviceService {
   private finaldata=[];
   private apiurl="http://jsonplaceholder.typicode.com/users";
   constructor(private http: HttpClient) { }
   getData() {
      return this.http.get(this.apiurl);
   }
}

在组件中调用服务并获取数据

随后在 AppComponent 中注入该服务,并通过订阅获取到的数据,将其存储到 personaldetails 变量中,供模板渲染使用。

import { Component } from '@angular/core';
import { MyserviceService } from './myservice.service';
@Component({
   selector: 'app-root',
   templateUrl: './app.component.html',
   styleUrls: ['./app.component.css']
})
export class AppComponent {
   title="Angular 7 Project!";
   public personaldetails=[];
   constructor(private myservice: MyserviceService) {}
   ngOnInit() {
      this.myservice.getData().subscribe((data) => {
         this.personaldetails=Array.from(Object.keys(data), k=>data[k]);
         console.log(this.personaldetails);
      });
   }
}

数据已经成功获取,现在可以在模板中简单展示用户列表。

Angular 7 - Drag and Drop Module

.divlayout{ width: 40%; background-color: #ccc; margin-bottom: 5px; padding: 10px 10px; border: 3px solid #73AD21; }

浏览器中看到的初始界面如下:

\

在模板中添加 CDK 拖放指令

仅有静态列表是不够的,我们需要在 app.component.html 中添加 Angular CDK 提供的拖放指令,让元素真正可拖拽。修改后的模板代码如下:

Angular 7 - Drag and Drop Module

{{item.name}}

关键属性说明:cdkDropList 定义可放置区域,cdkDropListData 绑定数据源数组,cdkDrag 让每个元素可拖拽,cdkDropListDropped 监听放下事件。现在可以尝试拖动,但会发现松开鼠标后元素会弹回原位——因为我们尚未实现真正的放置逻辑。

\

为了让拖放生效,需要在组件中编写 onDrop 事件处理函数。首先导入必要的工具函数:

import {CdkDragDrop, moveItemInArray, transferArrayItem} 
from '@angular/cdk/drag-drop';

完整的组件代码更新如下:

import { Component } from '@angular/core';
import { MyserviceService } from './myservice.service';
import {CdkDragDrop, moveItemInArray, transferArrayItem} from '@angular/cdk/drag-drop';
@Component({
   selector: 'app-root',
   templateUrl: './app.component.html',
   styleUrls: ['./app.component.css']
})
export class AppComponent {
   title="Angular 7 Project!";
   public personaldetails=[];
   constructor(private myservice: MyserviceService) {}
   ngOnInit() {
      this.myservice.getData().subscribe((data) => {
         this.personaldetails=Array.from(Object.keys(data), 
         k=>data[k]);
         console.log(this.personaldetails);
      });
   }
   onDrop(event: CdkDragDrop) {
      if (event.previousContainer === event.container) {
         moveItemInArray(event.container.data, 
            event.previousIndex, event.currentIndex);
      } else {
         transferArrayItem(event.previousContainer.data,
         event.container.data,
         event.previousIndex,
         event.currentIndex);
      }
   }
}

onDrop 函数是核心逻辑:如果拖放发生在同一个列表内,使用 moveItemInArray 调整元素顺序;如果跨列表拖放(本例只有一个列表,但代码已预留接口),则使用 transferArrayItem 移动元素。

再次刷新浏览器,观察最终效果:

\

现在用户可以自由拖拽列表项,重新排列顺序,整个过程流畅无闪烁。该解决方案完全适用于实际项目中的拖放排序需求。

来源:https://www.jb51.net/javascript/307467vwy.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
DCloud平台选型指南 适用场景与核心差异详解

DCloud平台选型指南 适用场景与核心差异详解

DCloud是一个围绕跨平台开发与流应用构建的技术生态,旨在帮助前端开发者使用Web技术开发高性能移动应用。其核心产品包括集成开发环境HBuilderX和基于Vue js的uni-app框架,支持一套代码发布至iOS、Android、Web及多端小程序。相比ReactNative和Flutter,uni-app在多端覆盖和Vue技术栈学习成本上具有优势,适合

时间:2026-07-10 06:47
DCloud使用教程与常见问题解决方案详解

DCloud使用教程与常见问题解决方案详解

DCloud提供跨平台应用开发方案,核心为HBuilderX与uni-app框架。开发者使用Vue js语法编写代码,可编译发布至iOS、Android、Web及小程序等多端。流程涵盖项目创建、开发调试与真机预览。常见问题如设备识别、编译失败等可通过检查设置、查看日志与条件编译解决。应用完成后支持云打包生成安装包。

时间:2026-07-10 06:47
DCloud新手入门教程 从零开始快速掌握开发技巧

DCloud新手入门教程 从零开始快速掌握开发技巧

DCloud是一个基于Web技术的跨平台应用开发平台,允许开发者使用HTML5等语言编写代码,并编译为iOS、Android及小程序应用,实现“一次编写,多端发布”。开发需使用HBuilderX,基于Vue js进行页面开发,平台提供丰富组件与API,并支持插件市场扩展功能。

时间:2026-07-10 06:47
DCloud新手入门指南从零开始了解这个开发平台

DCloud新手入门指南从零开始了解这个开发平台

DCloud是一个移动应用开发平台,旨在帮助前端开发者使用Web技术高效开发性能接近原生的跨平台应用。其核心产品包括HBuilderX开发环境和基于Vue js的uni-app框架,可实现一次开发、多端发布。平台通过完整工具链和插件生态降低开发门槛,适合需要快速迭代、覆盖多端的应用场景。

时间:2026-07-10 06:47
Zepto实战项目优化技巧与应用场景详解

Zepto实战项目优化技巧与应用场景详解

Zepto js作为轻量级JavaScript库,专为移动端优化,体积仅约10KB。它支持模块化定制,可按需构建以减小体积。使用时需减少DOM操作、善用事件委托,并可混合原生API提升性能。Zepto能融入现代工程流,但需注意其与jQuery的API差异及兼容性限制,适合在移动端性能优先的场景中替代jQuery。

时间:2026-07-10 06:47
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜