html - استفاده از کشیدن و رها کردن HTML5 با Angular material 2 md-list


الگوی کامپوننت زیر را در نظر بگیرید، من در حال تلاش برای دستیابی به قابلیت مرتبسازی مجدد عناصر فهرست برای Angular Material 2 و تگ li ساده هستم.

این قابلیت برای تگ li کاملاً کار میکند اما در مورد md-list-item عمل نمیکند.

چرا اینطور است؟

قالب من:

<md-nav-list>
  <md-list-item *ngFor="let i of arr" draggable="true" (dragenter)="dragenter($event)" (dragstart)="dragstart($event)">
    {{i}}
  </md-list-item>
</md-nav-list>

<ul>
  <li *ngFor="let i of arr" draggable="true" (dragenter)="dragenter($event)" (dragstart)="dragstart($event)">{{i}}</li>
</ul>

توابع فراخوانی شده:

  source: any;

  /**
   * CHECKS IF ONE ELEMENT LIES BEFORE THE OTHER
  */
  isbefore(a, b) {
    if (a.parentNode == b.parentNode) {
      for (var cur = a; cur; cur = cur.previousSibling) {
        if (cur === b) {
          return true;
        }
      }
    }
    return false;
  }
  /**
   * LIST ITEM DRAP ENTERED
  */
  dragenter($event) {
    if (this.isbefore(this.source, $event.target)) {
      $event.target.parentNode.insertBefore(this.source, $event.target); // insert before
    }
    else {
      $event.target.parentNode.insertBefore(this.source, $event.target.nextSibling); //insert after
    }
  }


  /**
   * LIST ITEM DRAG STARTED
   */
  dragstart($event) {
    this.source = $event.target;
    $event.dataTransfer.effectAllowed = 'move';
  }

تصویر صفحه مسئله:

برای مشاهده این تصویر کلیک کنید

همانطور که در اسکرینشات قابل مشاهده است، وقتی هر md-list-item را میکشم، مرورگر شروع به کشیدن تمام محتوا حتی از مؤلفه والد میکند.

پاسخ شماره ۱

به جای event.target از event.currentTarget استفاده کنید زیرا md-list-item دارای div تو در تو است در حالی که شما نیاز دارید md-list-item را حرکت دهید

/**
 * LIST ITEM DRAP ENTERED
 */
dragenter($event) {
    let target = $event.currentTarget;
    if (this.isbefore(this.source, target)) {
        target.parentNode.insertBefore(this.source, target); // insert before
    }
    else {
        target.parentNode.insertBefore(this.source, target.nextSibling); //insert after
    }
}


/**
 * LIST ITEM DRAG STARTED
 */
dragstart($event) {
    this.source = $event.currentTarget;
    $event.dataTransfer.effectAllowed = 'move';
}

و غیرفعال کردن افکت موج

<md-list-item [disableRipple]="true"

توانایی کشیدن تنها یک مورد

مثال Plunker