Angular7 cdkDropList между массивами с динамическими списками - PullRequest
0 голосов
/ 07 ноября 2018

Я получаю следующую ошибку: ERROR TypeError: Cannot assign to read only property '2' of string 'One' из следующего списка данных, который я создал, чтобы имитировать форму, на которую похожи мои фактические данные, и представление шаблона, которое я видел, чтобы использовать из угловой материальной документации для динамических списков, подобных этим. Но хотя они говорят, что делать, они не дают пример ..

Не могу заставить работать следующее:

Компонент:

lists = [];

ngOnInit() {
    this.lists = [{number: 'One', amount: [1, 2, 3, 4]}, {number: 'Two', amount: [5, 6, 7, 8]}, {number: 'Three', amount: [9, 10, 11, 12]}];
}

drop(event: CdkDragDrop<string[]>) {
    if (event.previousContainer === event.container) {
        moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
    } else {
        transferArrayItem(event.previousContainer.data,
            event.container.data,
            event.previousIndex,
            event.currentIndex);
    }
}

Шаблон:

<div cdkDropList [cdkDropListData]="list.number" *ngFor="let list of lists" (cdkDropListDropped)="drop($event)">
    {{list.number}}
    <div cdkDrag [cdkDragData]="item" *ngFor="let item of list.amount">
        {{item}}
    </div>
</div>

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Если вы хотите переместить элемент между массивами, вы можете пометить каждый cdkDropList с помощью #mark-name и использовать директиву cdkDropListConnectedTo для их соединения.

А если число cdkDropList неизвестно, вы можете использовать директиву cdkDropListGroup для автоматической установки соединения между cdkDropList.

пример будет:

<div cdkDropListGroup>
    <div cdkDropList *ngFor="let list of lists; let i=index;"
         [cdkDropListData]="list.number" 
         (cdkDropListDropped)="drop($event)">{{list.number}}

           <div cdkDrag *ngFor="let item of list.amount"
                [cdkDragData]="item"  
                (mouseenter)="enter(i)" 
                style="border:1px solid black">{{item}}
           </div>
    </div>
</div>

Пример Stackblitz

вот пример код, скопированный с примера углового материала

и с динамическим номером списка

надеюсь, это поможет, ура!

0 голосов
/ 09 ноября 2018

Вы должны получить фактический индекс вашего элемента списка .. Попробуйте это:

TS:

activeNumIndex: number;
enter(i) {
    this.activeNumIndex = i;
  }

  drop(event: CdkDragDrop<string[]>) {
    if (event.previousContainer === event.container) {
      moveItemInArray(this.lists[this.activeNumIndex].amount, event.previousIndex, event.currentIndex);
    } else {
      transferArrayItem(event.previousContainer.data,
        event.container.data,
        event.previousIndex,
        event.currentIndex);
    }
  }

HTML:

<div cdkDropList [cdkDropListData]="list.number" *ngFor="let list of lists; let i=index;" (cdkDropListDropped)="drop($event)">
    {{list.number}}
    <div cdkDrag [cdkDragData]="item" *ngFor="let item of list.amount" (mouseenter)="enter(i)" style="border:1px solid black">
        {{item}}
    </div>
</div>

Вот дубликат в Stackblitz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...