开发学院

您的位置:首页>教程>正文

教程正文

Angular7:Materials/CDK-拖拽

  添加到Angular7 CDK的新拖放功能有助于从列表中拖放元素。借助一个例子,我们将了解拖放模块的工作原理。该功能被添加到cdk。我们需要首先下载依赖关系,如下所示

npm install @angular/cdk --save

拖放功能

  一旦完成上述步骤。让我们在app.module.ts中导入拖放模块,如下所示.

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”导入的,该模块被添加到导入数组中,如上所示。

  我们将使用API(http://jsonplaceholder.typicode.com/users)中的详细信息显示在屏幕上。我们有如下所示从api获取数据的服务

myservice.service.ts

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);
   }
}

  完成后,调用app.component.ts内部的服务,如下所示.

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);
      });
   }
}

  我们在personaldetails变量中有所需的数据。现在让我们使用同样的方法显示给用户,如下所示

<h3>Angular 7 - Drag and Drop Module</h3>
<div>
   <div *ngFor="let item of personaldetails; let i = index" class="divlayout”>
      {{item.name}}
   </div >
</div>

  我们添加了class = "divlayout ",该类的详细信息在app.component.css中。

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

  浏览器中将显示以下屏幕

drag_drop.jpg

  它暂时没有拖放效果,我们需要在app.component.html添加拖放cdk属性,如下所示

<h3>Angular 7 - Drag and Drop Module</h3>
<div cdkDropList
   #personList = "cdkDropList"
   [cdkDropListData] = "personaldetails"
   [cdkDropListConnectedTo] = "[userlist]"
   class = "example-list"
   (cdkDropListDropped) = "onDrop($event)" >
   
   <div *ngFor = "let item of personaldetails; 
      let i = index" class = "divlayout" cdkDrag>
      {{item.name}}
   </div >
</div>

  代码显示的是启用拖放所需的所有属性。当您在浏览器中打开时,它允许您拖动项目。它不会把它放在列表中,当您离开鼠标指针时,它会保持不变。

drag_drop_module.jpg

  在这里,它允许从列表中拖动项目,但是一旦您离开鼠标指针,它将会移动并停留在相同的位置。要添加拖放功能,我们需要在app.component.ts中添加事件onDrop,如下所示

  首先,我们必须导入dragdrap cdk模块,如下所示。

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

  以下是app.component.ts中的完整代码。

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<string[]>) {
      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函数负责将拖动的项目放到所需的位置。

  它利用了我们从cdk dragdrop模块导入的moveItemInArray和transferArrayItem。

  现在让我们在浏览器中再次查看演示

drag_drop_position.jpg

  现在,你可以将项目拖放到如上所示的所需位置。该功能工作非常平滑,没有任何闪烁问题,可以在您的应用程序中随时随地使用。