В настоящее время я использую Angular 2 и модуль перетаскивания из https://material.angular.io/cdk/drag-drop/overview. Я сделал так, чтобы функции перетаскивания работали.У меня есть два разных типа объектов классов, которые я хотел бы ограничить их собственными типами списков перетаскивания.
Вероятно, это можно решить с помощью группировки списков, но, поскольку я использую рекурсию, возникли другие проблемы...
В настоящее время у меня есть все списки в одной и той же группе, что означает, что в каждом списке можно перетаскивать что угодно (cdkDropListGroup, помещается в компонент перед выполнением рекурсивной части).
Я пытаюсь ограничить списки, чтобы они принимали только Элемент или Атрибут (но не оба), но я не знаю, как это сделать ...
У меня есть следующее:
Классы:
export class Attribute {
name: string;
type: string;
}
export class Element {
id: number;
name: string;
elements: Element[]
attributes: Attribute[];
}
HTML:
<div >
Elements
<div
cdkDropList
[cdkDropListData]="elements"
class="example-list"
(cdkDropListDropped)="drop($event)"
[cdkDropListEnterPredicate]="isElement">
<div type="button" text-align="right" class="btn btnNotInline" (click)="addNewElement()">
<img src="assets/img/IconPlus.png" class="elementListIcon"></div>
<div *ngFor="let element of elements" class="example-box" cdkDrag>
<mat-list>
<mat-list-item>
<mat-form-field appearance="standard dense" class="example-container">
<input matInput placeholder="{{element.name}}">
</mat-form-field>
</mat-list-item>
<mat-list-item>
<div
cdkDropList
[cdkDropListData]="attributes"
class="cdk-drag-list-attributes"
(cdkDropListDropped)="drop($event)"
[cdkDropListEnterPredicate]="isAttribute">
<div type="button" text-align="right" class="btn btnNotInline" (click)="addNewAttribute()">
<img src="assets/img/IconPlusPurple.png" class="elementListIcon"></div>
<div *ngFor="let attribute of attributes" class="example-container" cdkDrag>
<p class="mat-input-element-attribute">
<input matInput placeholder="{{attribute.name}}">
<input matInput placeholder="{{attribute.type}}">
</p>
</div>
</div>
</mat-list-item>
<mat-list-item>
<app-listboardelement [attributes]="element.attributes" [elements]="element.elements"></app-listboardelement>
</mat-list-item>
</mat-list>
</div>
тс.вызываемый метод (атрибут выглядит одинаково)
isElement(drag : CdkDrag){
console.log("check " + (drag instanceof Element) + typeof drag + " , "+ typeof drag.data + ", "+ drag.data + " , " +(drag.data instanceof Element));
return (drag.data instanceof Element);
}
из вывода, который я просто получаю: «проверить ложный объект, неопределенный, неопределенный, ложный». Из этого я попытался сравнить перетаскиваемый объект с классом.... но мне не повезло.
Можно ли как-нибудь динамически ограничить перетаскиваемый объект определенными списками?Я знаю о [cdkDropListConnectedTo], но это вызвало у меня проблемы с происходящей рекурсией и привязками.Любое руководство будет приветствоваться
РЕДАКТИРОВАТЬ: Добавлено изображение для представления того, как оно отображается - но не работает должным образом;![enter image description here](https://i.stack.imgur.com/TYDNdm.png)