Kendo Sortable для Angular - получение новой позиции в индексе
Используемые каркасы
- Угловой и Кендо UI
Что я делаю
У меня есть список данных, полученных через Firestore
Это уже заказано на основе имущества в пожарном магазине
У меня установлен и импортирован Kendo Sortable в мой модуль
Что работает
- Я могу перетащить элементы интерфейса вокруг
Что не работает
Согласно документации, я пишу в консоль, чтобы увидеть индекс элемента
Кажется, что позиция индекса для onDragStart() кажется правильной
onDragEnd() всегда отображается как -1 (см. прикрепленный скриншот) консольный журнал перетаскивания элементов о
Вопросы
- Моя цель - переместить элементы списка и получить их новый элемент индекса. Оттуда, я надеюсь, я смогу написать функцию для записи новых позиций в базу данных. Однако есть ли способ определить правильный индекс конца?
Component.ts
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';
import { Router, ActivatedRoute } from '@angular/router';
import { DataEvent, DragDropEvent } from '@progress/kendo-angular-sortable';
@Component({
selector: 'app-albums-list',
templateUrl: './albums-list.component.html',
styleUrls: ['./albums-list.component.css'],
encapsulation: ViewEncapsulation.None // testing
})
export class IssuesListComponent implements OnInit {
private albumsCollection: AngularFirestoreCollection<any>;
albums: Observable<any[]>;
albumFolderId: string;
// KENDO TESTING
public events: string[][] = [[], []];
public onDataAdd(src: number, e: DataEvent): void {
console.log(src, 'dataAdd', e.index);
}
public onDataRemove(src: number, e: DataEvent): void {
console.log(src, 'dataRemove', e.index);
}
public onDragEnd(src: number, e: DragDropEvent): void {
console.log(src, 'dragEnd', e.index);
}
public onDragOver(src: number, e: DragDropEvent): void {
// Not logging due to the large number of events
}
public onDragStart(src: number, e: DragDropEvent): void {
console.log(src, 'dragStart', e.index);
}
// private log(src: number, event: string, itemIndex: number): void {
// this.events[src].push(`${event} - ${this.items[src][itemIndex]}`);
// }
constructor(
private readonly afs: AngularFirestore,
private activatedRoute: ActivatedRoute,
private router: Router
) { }
ngOnInit() {
// Look at the url for the Folder ID and set the local variable
this.activatedRoute.params.forEach((urlParameters) => {
this.albumFolderId = urlParameters['folderId'];
// Return the issues list
this.getAlbumData();
});
}
getAlbumData() {
this.albumCollection = this.afs.collection<any>(`/albumFolders/${this.albumFolderId}/albums`, ref => {
return ref.orderBy('album_order');
});
// Get the data
this.albums = this.albumCollection.snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return { id, ...data };
});
});
}
}
Component.html
<kendo-sortable
[navigatable]="true"
[animation] = "true"
[data]="albums | async"
class="list__ul"
itemClass="list__li"
activeItemClass=""
(dataAdd)="onDataAdd(i, $event)"
(dataRemove)="onDataRemove(i, $event)"
(dragEnd)="onDragEnd(i, $event)"
(dragOver)="onDragOver(i, $event)"
(dragStart)="onDragStart(i, $event)"
>
<ng-template let-item="item">
<h2 class="list__h2"> {{ item.album_title }} </h2>
<span class="list__sub"> {{ item.album_date}} </span>
</ng-template>
</kendo-sortable>
2 ответа
Я сделал это с помощью ссылки на элемент локальной переменной (например, #element
). Передав это в качестве параметра dragEnd
Событие, можно определить новый порядок.
Компонент HTML
<kendo-sortable #sortable [data]="stages" (dragEnd)="onDragEnd(sortable.data)">
<ng-template let-stage="item">
<div draggable="true">{{stage.name}}</div>
</ng-template>
</kendo-sortable>
Обработчик onDragEnd в Component .ts
public onDragEnd(data): void {
let newOrder = data.map(o=>o.id);
}
Если я понимаю это конкретно, вы хотите индекс легированного файла?
В этом примере Kendo Angular 2 вы можете увидеть тот индекс, который вы хотели (я добавил консольный журнал, чтобы показать, где находится какой индекс):
private handleDragAndDrop(): Subscription {
const sub = new Subscription(() => {});
let draggedItemIndex;
document.querySelectorAll('.k-grid-content tr')
.forEach(item => {
this.renderer.setAttribute(item, 'draggable', true);
const dragStart = Observable.fromEvent(item, 'dragstart');
const dragOver = Observable.fromEvent(item, 'dragover');
const drop = Observable.fromEvent(item, 'drop');
sub.add(dragStart.subscribe(({target}) => {
draggedItemIndex = target.rowIndex;
console.log("Drag start: " + target.rowIndex)
}));
sub.add(dragOver.subscribe((e: any) => e.preventDefault()));
sub.add(drop.subscribe((e: any) => {
e.preventDefault();
const dataItem = this.gridData.data.splice(draggedItemIndex, 1)[0];
const dropIndex = e.target.closest('tr').rowIndex;
this.zone.run(() =>{
console.log("Drag drop/stop: " + dropIndex)
this.gridData.data.splice(dropIndex, 0, dataItem)
}
);
}));
});