ドロップゾーンを動的に作成する方法はありますか? ngForとcdkDropListに問題があります。
これが私の最初のリストとドラッグ可能な要素です。
<div class="subj-container"
cdkDropListOrientation="horizontal"
cdkDropList
#subjectList="cdkDropList"
[cdkDropListData]="subjects"
[cdkDropListConnectedTo]="[lessonList]"
(cdkDropListDropped)="drop($event)"
>
<div class="subject" *ngFor="let subject of subjects" cdkDrag>
{{subject.name}}
</div>
</div>
次に、2番目のリストを示します。
<div class="conta" cdkDropList
#lessonList="cdkDropList"
[cdkDropListData]="appointment.lessons"
[cdkDropListConnectedTo]="[subjectList]"
(cdkDropListDropped)="drop($event)">
<div class="sub" cdkDrag *ngFor="let lesson of appointment.lessons">
{{lesson.name}}
</div>
</div>
現在、クラス「conta」を持つdivは* ngFor内にあります。
私の問題は、2番目のリストにあると思います。 2番目のリストから要素をリスト1にドラッグすると、正常に機能しますが、要素をリスト1から2番目のリストのリストのインスタンスにドラッグしようとすると、要素がドラッグされていることを認識できません。デモはこちら:
ここで何か間違ったことをしていますか? TypeScriptパーツは正常に機能しています。
ありがとう
1日の調査の後、GithubのAngular CDKリポジトリで this pull requestが見つかりました。今、私の例にcdkDropListGroupを統合する方法がわからなかったため、[cdkDropListConnectedTo]に追加されるIDの配列を作成することにしました。
2番目のリストの各インスタンスには生成されたIDがあり、そのIDは適切なプレフィックス(2番目のリストではcdkDropList)で配列に追加されます。
<div cdkDropList
[attr.id]="addId(i, j)"
[cdkDropListData]="appointment.lessons"
[cdkDropListConnectedTo]="[subjectList]"
(cdkDropListDropped)="drop($event)"
>
addIdメソッド:
addId(i, j) {
this.LIST_IDS.Push('cdk-drop-list-' + i + '' + j);
return i + '' + j;
}
(cdk-drop-list-はIDプレフィックスです。CDKはcdkDropList属性を持つすべての要素にこのプレフィックスを配置します)
したがって、私の配列は次のようになります。
次に、その配列を最初のリストの[cdkDropListConnectedTo]に渡します。
<div class="subj-container"
cdkDropListOrientation="horizontal"
cdkDropList
#subjectList="cdkDropList"
[cdkDropListData]="subjects"
[cdkDropListConnectedTo]="LIST_IDS"
(cdkDropListDropped)="drop($event)"
>
そして、それは完璧に動作します!
これが同じ問題のある人を助けることを願っています。また、私が言及したプルリクエストを見てください。私の解決策は回避策にすぎません。おそらく、cdkDropListGroupを使用したより良い解決策があります。
CdkDropListGroupを使用すると、次のことができるようになりました。
<div cdkDropListGroup>
<div cdkDropList
[cdkDropListData]="data"
(cdkDropListDropped)="drop($event)">
<div class="row m-2">
<div *ngFor="let i of data cdkDrag>{{i}}</div>
</div>
</div>
<div class="subj-container"
cdkDropListOrientation="horizontal"
cdkDropList
#subjectList="cdkDropList"
[cdkDropListData]="subjects"
(cdkDropListDropped)="drop($event)">
</div>
</div>
この場合、cdkDropListConnectedToは不要になりました。 https://github.com/angular/material2/blob/master/src/cdk/drag-drop/drag-drop.md を参照してください
ソース リンク
デモ リンク
Dynamic Drag n Drop Listsの場合、#テンプレート変数の代わりにIDを使用できます
app.component.html
<div class="col-md-3" *ngFor="let week of weeks">
<div class="drag-container">
<div class="section-heading">Week {{week.id}}</div>
<div cdkDropList id="{{week.id}}" [cdkDropListData]="week.weeklist"
[cdkDropListConnectedTo]="connectedTo" class="item-list" (cdkDropListDropped)="drop($event)">
<div class="item-box" *ngFor="let weekItem of week.weeklist" cdkDrag>Week {{week.id}} {{weekItem}}</div>
</div>
</div>
</div>
app.component.ts
import { Component } from '@angular/core';
import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
weeks = [];
connectedTo = [];
constructor() {
this.weeks = [
{
id: 'week-1',
weeklist: [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
]
}, {
id: 'week-2',
weeklist: [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
]
}, {
id: 'week-3',
weeklist: [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
]
}, {
id: 'week-4',
weeklist: [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
]
},
];
for (let week of this.weeks) {
this.connectedTo.Push(week.id);
};
}
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);
}
}
}