Перетащите изображение в определенный регион

У меня есть галерея изображений, и я собираюсь перетащить эти изображения в зону перетаскивания.

Я пытался использовать его в двух случаях (используя мышь для перетаскивания изображения и используя перетаскивание cdk, которое также позволяет мне перемещать изображение в область капель).

Есть ли способ получить объект (имя, идентификатор ...) из изображения, которое было переброшено в зону перетаскивания? Я пытаюсь перетащить изображение в зону перетаскивания, и когда я отпускаю его там, я хочу знать, какое изображение было перетащено.

Есть ли способ добиться этого? Кто-нибудь может мне помочь?

Большое спасибо!

ДЕМО - STACKBLITZ

.TS

     onFileDropped($event) {
        this.prepareFilesList($event);
        console.log("evt", $event )

      }

      fileBrowseHandler(files) {
      this.prepareFilesList(files);
      }

      async prepareFilesList(files: Array<any>) {

      }

   @HostBinding('class.fileover') fileOver: boolean;
    @HostBinding('style.background-color') private background = '#f5fcff'
    @Output() fileDropped = new EventEmitter<any>();

    // Dragover listener
    @HostListener('dragover', ['$event']) onDragOver(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      this.fileOver = true;
      this.background = '#9ecbec';
    }

    // Dragleave listener
    @HostListener('dragleave', ['$event']) public onDragLeave(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      this.background = '#f5fcff'
      this.fileOver = false;
    }

    // Drop listener
    @HostListener('drop', ['$event']) public ondrop(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      this.background = '#f5fcff'
      this.fileOver = false;
      let files = evt.dataTransfer.files;

      this.fileDropped.emit(files);

    }

Используя изображения (cdkDrag), мне не удалось получить какие-либо события в зоне перетаскивания, которые обнаруживают запись чего-либо.

Используя обычные изображения, я смог выполнить функцию

 onFileDropped ($ event) {
    this.prepareFilesList ($ event);
    console.log ("evt", $ event)

  }

но я не получил результатов, как показано на рисунке.

Изображение




Ответы (1)


Одна из возможностей - создать свойство @input в директиве и присвоить ему значение при нажатии мыши из компонента.

директива dnd

 @Input() data;

компонент.html

//add [data]="selectedProduct" 

     <div class="card-body">
          <div class="mycontainer" appDnd [data]="selectedProduct" (fileDropped)="onFileDropped(sle)">
              <div class="row" style="margin-left: 0; margin-right: 0; justify-content: center;">
                <span>Drop your items here.</span>   
              </div>
          </div>
        </div>

//add (mousedown)="assignSelectedProduct(product)"

    <ng-container *ngFor="let product of data; let  j = index;">
      <li class="mdc-image-list__item" (mousedown)="assignSelectedProduct(product)" >
        <div class="mdc-image-list__image-aspect-container">
          <ng-container *ngIf="product.image == null; else productImage">
            <img src="" class="mdc-image-list__image imagenotfound">
          </ng-container>
          <ng-template #productImage>
            <img [src]="product.image" class="mdc-image-list__image">
          </ng-template>
        </div>
        <div class="mdc-image-list--with-text-protection">
                    <div class="mdc-image-list__supporting mdc-image-list__supporting">
                        <span class="mdc-image-list__label">{{product.name}}</span>
                    </div>
                </div>
      </li>
    </ng-container>

компонент.ts

selectedProduct; 

assignSelectedProduct(product){
  this.selectedproduct = product;
}

директива dnd

  // Drop listener
  @HostListener('drop', ['$event']) public ondrop(evt) {
  console.log(this.data, 'data');
  }
person Rahul Raveendran    schedule 17.03.2020
comment
Идеальный ! Благодарю вас ! - person Harry; 18.03.2020