J'ai trouvé quelques exemples basiques d'utilisation des classes .cdk-drag-preview et .cdk-drag-placeholder et ils semblent faire le travail quand ils sont là ne sont pas des éléments imbriqués.
En gros, j'ai une liste d'actions et chaque action est représentée dans un format complexe mat-card . Cette partie est en fait un autre composant, mais pour le bien de cet exemple, je vais le rendre aussi basique que possible.
Mon exemple est similaire à cette structure:
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
}
En composant angulaire
<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>
Je veux pouvoir faire ce qui suit:
Le problème de l'utilisation de .cdk-drag-preview et .cdk-drag-placeholder semble s'appliquer au div code> (parent de mat-card ); alors que j'essaie de changer la couleur de la bordure de son enfant.
Merci d'avance :)
ADDENDA
Mon défi le plus important est de changer la couleur de la bordure dans l'espace réservé à glisser. J'essaie de changer la couleur de la bordure et la marge gauche de l'espace réservé pour indiquer à l'utilisateur que l'action s'est déplacée vers la gauche ou la droite, représentant différents niveaux dans la liste.
3 Réponses :
Vous pouvez faire quelque chose comme ceci:
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';
}
<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>
Je vais examiner cela, je pense que j'ai essayé quelque chose comme ça. Mais mon défi le plus important est de changer la couleur de la bordure dans l'espace réservé à glisser
Vous voyez, j'essaie de changer la couleur de la bordure et la marge gauche de l'espace réservé pour indiquer à l'utilisateur que l'action s'est déplacée vers la gauche ou la droite, représentant différents niveaux dans la liste
Quelque chose comme ci-dessous atteindrait votre objectif?
Initialisez nativeElement x et y
dragMoved(e, action, i) {
// record new position
this.currentX = e.event.clientX;
this.currentY = e.event.clientY;
// logic to set startX and startY
// TRYING TO CHANGE CARD BORDER COLOR IF this.endX - this.startX > some number
if(this.startX < this.currentX){
this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-style', 'solid');
this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-color', 'green');
}
else if (this.startX > this.currentX){
this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-style', 'solid');
this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-color', 'blue');
}
}
Comparez le décalage X et utilisez rendere2 pour définir le style sur nativeElement
(cdkDragMoved)="dragMoved($event, action, i)"
Pour changer de couleur tout en faisant glisser, procédez comme suit.
Obtenir une référence à #cdkDropList dans la vue.
*ngFor="let action of actions; let i = index"
Définir l'index dans * ngFor
@ViewChild('cdkDropList') _dropList:any;
Passer l'index à la fonction
dragMoved(e, action) {
// record new position
this.currentX = e.event.clientX;
this.currentY = e.event.clientY;
// logic to set startX and startY
// TRYING TO CHANGE CARD BORDER COLOR IF this.endX - this.startX > some number
if(this.startX < this.currentX){
this._renderer.setStyle(e.source.element.nativeElement, 'border-style', 'solid');
this._renderer.setStyle(e.source.element.nativeElement, 'border-color', 'green');
}
else if (this.startX > this.currentX){
this._renderer.setStyle(e.source.element.nativeElement, 'border-style', 'solid');
this._renderer.setStyle(e.source.element.nativeElement, 'border-color', 'blue');
}
}
Recevoir l'index et atteindre les enfants du cdkDropList pour définir le style.
dragStart(e, action) {
const rect = e.source.element.nativeElement.getBoundingClientRect();
// initialize start X coord
this.startX = rect.x;
// initialize start Y coord
this.startY = rect.y;
}
Stackblitz
Le problème avec ceci est que cela change la couleur lorsque vous avez fini de déposer la carte. J'essaye de changer la couleur tout en la tenant / en la faisant glisser
voir stackblitz révisé et réponse.
merci, cela se rapproche. Permettez-moi de regarder de plus près une fois au travail;) +1 pour l'effort, c'est sûr
J'accepte cette réponse, car utiliser #cdkDropList et Renderer2 m'a donné assez pour faire ma tâche
Lorsqu'un élément cdkDrag est sélectionné, il créera un élément de prévisualisation visible lors du glissement. Ce sera un clone de l'élément d'origine. L'élément cloné supprimera son attribut id et ajoutera la classe .cdk-drag-preview.
Utilisez cdkDragMoved avec prudence, car cet événement se déclenchera pour chaque pixel que l'utilisateur a fait glisser.
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");
}
}
<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>
avez-vous essayé ce sélecteur? .cdk-drag-preview mat-card, .cdk-drag-placeholder mat-card {}
@onik J'ai essayé mais cela ne fonctionne pas. J'ai l'impression que lorsque vous faites glisser une carte, le matériau crée une structure de copie différente pour l'aperçu et je n'arrive pas à me connecter à cet élément pour changer son CSS dynamiquement