J'ai trouvé des exemples de base d'utiliser .cdk-drag-preview
et .cdk-drag-placeholder
classes et ils semblent faire le travail quand il n'y a pas d'éléments imbriqués.
Fondamentalement, j'ai une liste d'actions et chaque action est représentée dans un complexe mat-card
format. Cette partie est réellement effectuée comme un autre composant, mais pour l'intention de cet exemple, je le ferai aussi fondamental que possible.
Mon exemple est similaire à cette structure:
<style>
.my_action { border: 2px solid red; }
</style>
<div class="drop_area" cdkDropList>
<div *ngFor="let action of actions"
(cdkDragStarted)="dragStart($event, action)"
(cdkDragMoved)="dragMoved($event, action)"
(cdkDragEnded)="dragEnded($event, action)" cdkDrag>
<mat-card class="my_action">
{{ action.name }}
</mat-card>
</div>
</div>
IN angular Composant
dragStart(e, action) {
// initialize start X coord
this.startX = 0;
// initialize start Y coord
this.startY = 0;
}
dragMoved(e, action) {
// record new position
this.endX = e.pointerPosition.x;
this.endY = e.pointerPosition.y;
// logic to set startX and startY
// TRYING TO CHANGE CARD BORDER COLOR IF this.endX - this.startX > some number
}
Je veux pouvoir faire ce qui suit:
La question de l'utilisation .cdk-drag-preview
et .cdk-drag-placeholder
semble appliquer à la draggable div
(parent de mat-card
); ATTENDU QUE, j'essaie de changer la couleur de la frontière de son enfant.
Merci d'avance :)
ADDENDUM
Mon défi le plus important est de changer la couleur de la frontière dans l'espace réservé à la glissement. J'essaie de changer la couleur de la frontière et la marge gauche de l'espace réservé pour indiquer l'utilisateur que l'action a été déplacée vers la gauche ou la droite, représentant différents niveaux dans la liste.
Lorsqu'un élément CDKDRAG est ramassé, il créera un élément de prévisualisation visible tout en faisant glisser. Ce sera un clone de l'élément d'origine. L'élément cloné supprimera son attribut d'identification et ajoutera la classe .CDK-glisser-aperçu.
Utilisez CDKDRAGMOVEt avec prudence, car cet événement déclenchera pour chaque pixel que l'utilisateur a traîné.
<div cdkDropList class="example-list">
<div class="example-box" *ngFor="let action of actions" cdkDrag
(cdkDragStarted)="dragStart($event)"
(cdkDragMoved)="dragMoved($event)">
{{ action.name }}
</div>
</div>
export class CustomComponent {
cloned: any;
actions = [
{ name: "one" },
{ name: "two" },
{ name: "three" }
];
constructor(private _renderer: Renderer2) { }
dragStart(event) {
this.cloned = document.getElementsByClassName("cdk-drag-preview")[0];
}
dragMoved(event) {
this._renderer.removeClass(this.cloned, "red");
this._renderer.removeClass(this.cloned, "green");
const distance: { x: number, y: number } = event.distance;
this._renderer.addClass(this.cloned, (distance.x > 0) ? "green" : "red");
}
}
Vous pouvez le faire quelque chose comme ça:
<div class="drop_area" cdkDropList>
<div *ngFor="let action of actions;let i = index;"
(cdkDragStarted)="dragStart($event, action)"
(cdkDragMoved)="dragMoved($event, action, i)"
(cdkDragEnded)="dragEnded($event, action)" cdkDrag>
<mat-card class="my_action{{i}}">
{{ action.name }}
</mat-card>
</div>
dragMoved(e, action, index: number) {
// record new position
this.endX = e.pointerPosition.x;
this.endY = e.pointerPosition.y;
// login to set startX and startY
// TRYING TO CHANGE CARD BORDER COLOR IF this.endX - this.startX > some number
document.getElementsByClassName('my_action'+index)[0].style.borderColor='blue';
}