с использованием ng2-dragula в 2018 году - PullRequest
0 голосов
/ 29 июня 2018

Невозможно реализовать вложенное перетаскивание ng2-dragula, даже если кажется, что люди находят решения "вложенного" препятствия, я не могу лично преодолеть этот барьер.

У меня есть то, что я думаю, это простая компоновка с исходной драгулой и множеством целевых драгул, хитрость заключается в попытке перетаскивания этих целевых групп (здесь можно перетаскивать экземпляры «Клиента»).

enter image description here

очевидно, что по умолчанию действие «щелкнуть и перетащить» запускает как дочерний, так и родительский драгулы.

но при попытке реализовать любой из параметров moves, accepts dragula они вызывают широкий спектр исключений.

accepts получает неопределенное значение для target, но наиболее часто встречающаяся ошибка -

TypeError: sourceModel.splice is not a function

, который я получаю за moves и invalid.

github не сильно помогает, так как у разработчиков есть дела поважнее (а в случае с ванильным драгулой уже давно нет).

проблема здесь в том, что каждый онлайн ругается на N вариантов следующих решений:

  options = {
    direction: 'horizontal',
    isContainer: function (el) {
      return el.classList.contains('bag-two');
    },
    moves: function(el, container, target) {
      return target.classList.contains('handle');
    }
  };

options = {
    direction: 'horizontal',
    moves: function (el, container, handle) {
      return handle.classList.contains('handle');
    },
}
  options = {
    direction: 'horizontal',
    invalid: (element, source, handle, sibling, event) => {element.className.includes('bag-one')},
  };

Дело в том, что в 2018 году и в angular / ng2-dragula ни один из них не работает.

почти все они бросают TypeError: sourceModel.splice is not a function

вот мой HTML:

<div class="root" [ngClass]="' ' + opened">
  <div class="customer-groups-view flex">
    <div class="sidebar">
      <div class="ellipsis">Nouveau Clients : </div>
      <div class="allow-scroll-bottom">
        <div *ngFor="let una of unassigned" [dragula]="'bag-one'" [dragulaModel]="una">
          <app-pane [titleI]="una" [valueI]="una"></app-pane>
        </div>
      </div>
    </div>


    <div class="customer-groups flex-1">
      <div class="flex allow-scroll-right">
        <div *ngFor="let group of groups" [dragula]="'bag-two'" [dragulaModel]="group" [dragulaOptions]="options" class="bag-two flex">
          <div class="customer-group ff" >
            <div class="group-title ellipsis">Client</div>
            <div class="elem-list" (click)="$event.stopPropagation()">
              <div *ngFor="let elem of groupList" [dragula]="'bag-one'" [dragulaModel]="elem">
                <app-pane delayDrag  [titleI]="elem" [valueI]="elem"></app-pane>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

и мой тс:

import {AfterViewInit, Component, ElementRef, OnInit} from '@angular/core';
import {conf} from '../common/services/variables';
import {InternationalizedNotifService} from '../common/services/i18n-ed.notif.service';
import {SnotifyService} from 'ng-snotify';
import {Apis} from '../common/api/apis';
import {StoreService} from '../common/services/store.service';
import {DragulaService} from 'ng2-dragula';
import dragula from 'dragula';
import autoScroll from 'dom-autoscroller';

@Component({
  selector: 'app-groups',
  templateUrl: './groups.component.html',
  styleUrls: ['./groups.component.scss']
})
export class Groups implements OnInit, AfterViewInit {

  options = {
    direction: 'horizontal',
    invalid: (element, source, handle, sibling, event) => {element.className.includes('bag-one')},
  };
  justCalledGetCustomersAPItimeout;
  resetCalled = false;
  opened = false;
  scrollAmount;
  data;
  scroll: any;

  groupList = [
    'aadsd',
    'zqds',
    'yghibv',
  ];
  unassigned = [
    'aaappdd',
    'a8d',
    'aaappdd',
    'aaappdd',
    'aaappdd',
    'aa1',
  ];
  groups = [
    'aaadzdaze',
    'aaadzdaze',
    'aaadzdaze',
    'adf',
    'aaadzdaze',
  ];


  constructor(
    private api: Apis,
    private store: StoreService,
    private element: ElementRef,
    private notif18nMessages: InternationalizedNotifService,
    private snotifyService: SnotifyService) {
  }

  ngOnInit() {
    this.doCallWithNotif('getCustomers');
    this.store.topBarOpened$.subscribe(bool => {
      if(bool === true || bool === false) this.opened = bool;
    }, (error) => console.log(error), () => {});

  }

  ngAfterViewInit(){
    const th = this;
    this.scrollAmount = this.element.nativeElement.querySelector('.allow-scroll-right');
    this.scrollAmount.addEventListener('wheel', e => {
      th.scrollAmount.scrollLeft -= (e.wheelDelta)/1.5
    }, false);
  }

РЕДАКТИРОВАТЬ ::

На самом деле лучшее поведение, которое я могу получить, это когда я удаляю все [dragulaModel] по крайней мере, тогда я получаю желаемое поведение на одном из перетаскиваемых наборов: клиентах.

перетаскивание потомка приведет к успешному перетаскиванию родителя, а затем:

TypeError: Cannot read property '0' of undefined

1 Ответ

0 голосов
/ 29 июня 2018

обновление (21-11-2018) и примечание:

Я закончил тем, что не использовал драгула, так как сам помощник углового драгула советовал мне против этого. В итоге я реализовал встроенное перетаскивание без использования каких-либо библиотек, оно работает намного лучше и дает мне больше возможностей

ответ:

хорошо, решил это:

Вы должны поставить [dragula]="'bag-two'" [dragulaModel]="group" [dragulaOptions]="options" поверх *ngIf, а не внутри.

также не забудьте указать массивы или массивы, а не массивы строк.

также опции в качестве аргумента в DOM не будут работать.

Наконец код будет выглядеть так:

<div class="root" [ngClass]="' ' + opened">
  <div class="customer-groups-view flex">
    <div class="sidebar">
      <div class="ellipsis">Nouveau Clients : </div>
      <div class="allow-scroll-bottom" [dragula]="'bag-one'" [dragulaModel]="una">
        <div *ngFor="let una of unassigned">
          <app-pane [titleI]="una[0]" [valueI]="una[0]"></app-pane>
        </div>
      </div>
    </div>


    <div class="customer-groups flex-1">
      <div class="flex allow-scroll-right" [dragula]="'bag-two'" [dragulaModel]="group">
        <div *ngFor="let group of groupList" class="bag-two">
          <div class="customer-group" >
            <div class="flex"><div class="handle">X</div><div class="group-title ellipsis">Client</div></div>
            <div class="elem-list" [dragula]="'bag-one'" [dragulaModel]="elem">
              <div *ngFor="let elem of group" class="bag-one">
                <app-pane [titleI]="elem[0]" [valueI]="elem[0]"></app-pane>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

ц

import {AfterViewInit, Component, ElementRef, OnInit} from '@angular/core';
import {conf} from '../common/services/variables';
import {InternationalizedNotifService} from '../common/services/i18n-ed.notif.service';
import {SnotifyService} from 'ng-snotify';
import {Apis} from '../common/api/apis';
import {StoreService} from '../common/services/store.service';
import {DragulaService} from 'ng2-dragula';

@Component({
  selector: 'app-groups',
  templateUrl: './groups.component.html',
  styleUrls: ['./groups.component.scss']
})
export class Groups implements OnInit, AfterViewInit {

  justCalledGetCustomersAPItimeout;
  resetCalled = false;
  opened = false;
  scrollAmount;
  data;
  scroll: any;

  groupList = [
    [
      ['aaadzdaze'],
      ['aaadzdaze'],
      ['aaadzdaze'],
    ],
    [
      ['adf'],
      ['aaadzdaze'],
    ],
    [
      ['aaadzdaze'],
      ['aaa'],
    ],
    [
      ['aaadfe'],
      ['aafdfaze'],
    ]
  ];
  unassigned = [
    ['aaappdd'],
    ['aaappdd'],
    ['aaddfsppdd'],
    ['aaappdd'],
    ['aa4'],
    ['aaappdd'],
    ['a8d'],
    ['aaappdd'],
    ['aaap5appdd'],
    ['aaappdd'],
    ['aaappdd'],
    ['aa1'],
    ['aaappdd'],
    ['aaappdd'],
    ['aaddfsppdd'],
    ['aaappdd'],
    ['aa4'],
    ['aaappdd'],
    ['a8d'],
    ['aeappdd'],
    ['aaap5appdd'],
    ['aaappdd'],
    ['aaappdd'],
    ['aa1'],
    ['aaapupdd'],
    ['afadd'],
    ['aaddfsppdd'],
    ['aaappdd'],
    ['aa4'],
    ['aaappdd'],
    ['a8d'],
    ['aaappdd'],
    ['aaap5appdd'],
    ['aaappdd'],
    ['aaappdd'],
    ['aa1'],
  ];



  constructor(
    private api: Apis,
    private store: StoreService,
    private element: ElementRef,
    private notif18nMessages: InternationalizedNotifService,
    private snotifyService: SnotifyService,
    private dragulaService: DragulaService) {
    this.dragulaService.setOptions('bag-two', {
      moves: function (el, container, handle) {
        return handle.className === 'handle';
      }
      // moves: (element, source, handle, sibling) => {
      //   if (handle.className.includes('bag-one')) {
      //     return false;
      //   }
      //   return true;
      // }
    });
  }

  ngOnInit() {
    this.doCallWithNotif('getCustomers');
    this.store.topBarOpened$.subscribe(bool => {
      if(bool === true || bool === false) this.opened = bool;
    }, (error) => console.log(error), () => {});
  }
...