پشتیبانی از کشیدن و رها کردن در Angular 7
نویسنده: ابوالفضل روشن ضمیر
تاریخ: ۱۳۹۷/۰۸/۱۴ ۷:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
npm install @angular/cdk
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { FormsModule } from '@angular/forms';
@NgModule({
declarations: [ AppComponent ],
imports: [
BrowserModule,
FormsModule,
DragDropModule
],
bootstrap: [ AppComponent ]
})
export class AppModule {} <div cdkDrag> I'm Draggable </div>
<div cdkDrag cdkDragLockAxis="x"> I'm Draggable </div>
در ابتدا یک مدل را ایجاد میکنیم:
export interface Todo {
title: string;
type?: string;
}
فایل app.component.ts
export class AppComponent implements OnInit {
public title = 'Darg and drop';
public model: Todo;
public todo: Todo[];
public done: Todo[];
public cancelled: Todo[];
ngOnInit(): void {
this.setDefalutValue();
}
addItem(form, $event: Event) {
$event.preventDefault();
if (form.valid) {
if (this.model.type === 'todo') {
this.todo.push({ title: this.model.title });
} else {
this.done.push({ title: this.model.title });
}
} else {
alert('فرم معتبر نمیباشد . عنوان را وارد نمایید');
}
}
drop(event: CdkDragDrop<Todo[]>) {
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);
}
}
private setDefalutValue() {
this.todo = [
{ title: 'خرید مواد غذایی' },
{ title: 'رفتن به خانه' },
{ title: 'خوابیدن' }
];
this.done = [
{ title: 'بیدار شدن' },
{ title: 'مسواک زدن' },
{ title: 'دوش گرفتن' },
{ title: 'چک کردن ایمیل' }
];
this.cancelled = [];
this.model = {
title: null,
type: 'todo'
};
}
}
در اینجا 3 آرایه یکی برای to-do و یکی برای Done و دیگری برای Cancelled ایجاد میکنیم و به هر کدام تعدادی آیتم را اضافه میکنیم.
addItem : زمانیکه فرم را submit میکنیم اجرا میشود .
drop : زمانی اجرا میشود که یک آیتم را Drag and Drop کنیم. در ایجا شرط event.previousContainer === event.container زمانی درست است که جابجایی در درون یک لیست باشد و هدف در این صورت، مرتب سازی است .
moveItemInArray : ایندکس آیتمها را در همان لیست تغیر میدهد (مرتب سازی).
transferArrayItem: آیتم را از یک لیست حذف و به لیست دیگری اضافه میکند.
فایل app.component.html
<div>
<!-- فرم -->
<div>
<fieldset>
<legend>
اضافه کردن آیتم جدید
</legend>
<form #form="ngForm" (submit)="addItem(form,$event)">
<label></label>
<input type="text" required name="title" #name="ngModel" [(ngModel)]="this.model.title">
<label></label>
<select required name="type" #type="ngModel" [(ngModel)]="this.model.type">
<option value="todo">
انجام دادن
</option>
<option value="done">
انجام شده
</option>
</select>
<input type="submit" value="ذخیره">
</form>
</fieldset>
</div>
<!-- آیتمها -->
<div>
<fieldset>
<legend>
لیست آیتمها </legend>
<div>
<!-- انجام دادن -->
<div>
<p>
انجام دادن
</p>
<div cdkDropList #todoList="cdkDropList" [cdkDropListData]="todo" [cdkDropListConnectedTo]="[doneList, cancelledList]"
(cdkDropListDropped)="drop($event)">
<div *ngFor="let item of todo" cdkDrag>
<p> {{ item.title | titlecase }} </p>
</div>
</div>
</div>
<!-- انجام شده -->
<div>
<p>
انجام شده
</p>
<div cdkDropList #doneList="cdkDropList" [cdkDropListData]="done" [cdkDropListConnectedTo]="[todoList, cancelledList]"
(cdkDropListDropped)="drop($event)">
<div *ngFor="let item of done" cdkDrag>
<p> {{ item.title | titlecase }} </p>
</div>
</div>
</div>
<!-- انجام نشده -->
<div>
<p>
انجام نشده
</p>
<div cdkDropList #cancelledList="cdkDropList" [cdkDropListData]="cancelled" [cdkDropListConnectedTo]="[todoList, doneList]"
(cdkDropListDropped)="drop($event)">
<div *ngFor="let item of cancelled" cdkDrag>
<p> {{ item.title | titlecase }} </p>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
در ابتدا یک فرم داریم که در اینجا همه چیز مشخص است ( فرمهای مبتنی بر قالبها در Angular )
در ادامه 3 container را ایجاد میکنیم یکی برای to-do و یکی برای Done و در آخر یکی برای Cancelled
container ایجاد شده برای to-do :
<div cdkDropList #todoList="cdkDropList" [cdkDropListData]="todo" [cdkDropListConnectedTo]="[doneList, cancelledList]"
(cdkDropListDropped)="drop($event)">
<div *ngFor="let item of todo" cdkDrag>
<p> {{ item.title | titlecase }} </p>
</div>
</div>
توضیحات:
cdkDropList : یک container میباشد، برای آیتمهایی که قرار است Drag and Drop شوند.
todoList #:
id مربوط به container را مشخص میکند.
cdkDropListConnectedTo:
id مربوط به container های دیگری که میتواند آیتم های container جاری را بپذیرد.
cdkDropListData: مشخص کنند منبع داده است.
cdkDropListDropped: این رویداد زمانی اجرا میشود که Drag and Drop برای یک آیتم انجام شود.
cdkDrag: برای اینکه آیتمهای درون یک container قابلیت Drag and Drop را داشته باشند، این دایرکتیو را اضافه میکنیم.
تمام !
<div class="body-boundary cnt-drag">
<div class="dragable-item" cdkDrag cdkDragBoundary=".body-boundary"></div>
</div> <style>
.cnt-drag {
float: none;
border: 1px solid red;
height: 200px;
width: 200px;
margin: 50px auto;
}
.dragable-item {
width: 20px;
height: 20px;
background-color: green;
border-radius: 50%
}
</style>