Angular 嵌套的可拖动行和列
Angular nested draggable rows and columns
我看过的资源:
https://github.com/valor-software/ng2-dragula
描述类似问题的问题:
https://github.com/valor-software/ng2-dragula/issues/309
https://github.com/valor-software/ng2-dragula/issues/663
我正在使用 ng2-dragula
,我正在尝试嵌套可拖动项目,但尽管看了示例,我还是无法弄清楚如何去做。
这个允许将列从一行拖到另一行就好了:
<div>
<row *ngFor="let row of rows" dragula="columns" [dragulaModel]="row?.columns">
<column *ngFor="let column of row?.columns"></column>
</row>
</div>
但是我还需要行本身是可拖动的,所以我这样做了:
<div dragula="rows" [dragulaModel]="rows">
<row *ngFor="let row of rows" dragula="columns" [dragulaModel]="row?.columns">
<column *ngFor="let column of row?.columns"></column>
</row>
</div>
这样可以拖动行,但现在列不起作用,如果我尝试将 column
拖到另一个 row
中,我会收到错误消息:
ERROR DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
列也不能在同一行内重新排序。
似乎拖动 column
会导致拖动 row
而不是 column
。
我做错了什么?
我给你举了个例子。让我知道这是否回答了您的问题。为行设置 dragula 选项 "bag" 允许您传递自己的无效处理程序。因此,如果您尝试拖动名称为 "column" 的东西,例如 class,请不要让父容器拖动。
https://embed.plnkr.co/Y4Gy0nHuGKpaYQObXLWG/
在您的构造函数中,或每当您为父 dragula 设置 dragula 选项时:
constructor(dragulaService: DragulaService) {
dragulaService.setOptions('bag', {
invalid(el, handle) {
// If the selected element className is column,
// dont allow the row to be dragged. This will allow
// the column to be dragged separate from the row.
return (el.className == "column");
}
});
}
HTML:
<div [dragula]="'bag'" [dragulaModel]="rows">
<div class="row" *ngFor="let row of rows">
{{row.value}}
<div [dragula]="'bag2'" [dragulaModel]="row.columns">
<div class="column" *ngFor="let column of row.columns">
{{column.value}}
</div>
</div>
</div>
</div>
试试这个:
<div dragula="myBag" [dragulaModel]="rows" class="iAmContainer">
<row *ngFor="let row of rows" dragula="myBag" [dragulaModel]="row?.columns" class="iAmRow">
<column *ngFor="let column of row?.columns" class="iAmCol"></column>
</row>
</div>
我将 dragula="myBag"
设置为行和列,并在元素上设置 类。
现在 ngOnInit
使用类似这样的代码:
const bag: any = this.dragulaService.find('myBag');
if (bag !== undefined) this.dragulaService.destroy('myBag');
this.dragulaService.setOptions('myBag', {
revertOnSpill: true,
accepts: function (el, target, source, sibling) {
return !el.contains(target) &&
((el.className == 'iAmCol' && target.className == 'iAmRow') ||
(el.className == 'iAmRow' && target.className == 'iAmContainer'));
},
});
我使用元素和目标的 className
来确定它们是否兼容。
我看过的资源:
https://github.com/valor-software/ng2-dragula
描述类似问题的问题:
https://github.com/valor-software/ng2-dragula/issues/309
https://github.com/valor-software/ng2-dragula/issues/663
我正在使用 ng2-dragula
,我正在尝试嵌套可拖动项目,但尽管看了示例,我还是无法弄清楚如何去做。
这个允许将列从一行拖到另一行就好了:
<div>
<row *ngFor="let row of rows" dragula="columns" [dragulaModel]="row?.columns">
<column *ngFor="let column of row?.columns"></column>
</row>
</div>
但是我还需要行本身是可拖动的,所以我这样做了:
<div dragula="rows" [dragulaModel]="rows">
<row *ngFor="let row of rows" dragula="columns" [dragulaModel]="row?.columns">
<column *ngFor="let column of row?.columns"></column>
</row>
</div>
这样可以拖动行,但现在列不起作用,如果我尝试将 column
拖到另一个 row
中,我会收到错误消息:
ERROR DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
列也不能在同一行内重新排序。
似乎拖动 column
会导致拖动 row
而不是 column
。
我做错了什么?
我给你举了个例子。让我知道这是否回答了您的问题。为行设置 dragula 选项 "bag" 允许您传递自己的无效处理程序。因此,如果您尝试拖动名称为 "column" 的东西,例如 class,请不要让父容器拖动。
https://embed.plnkr.co/Y4Gy0nHuGKpaYQObXLWG/
在您的构造函数中,或每当您为父 dragula 设置 dragula 选项时:
constructor(dragulaService: DragulaService) {
dragulaService.setOptions('bag', {
invalid(el, handle) {
// If the selected element className is column,
// dont allow the row to be dragged. This will allow
// the column to be dragged separate from the row.
return (el.className == "column");
}
});
}
HTML:
<div [dragula]="'bag'" [dragulaModel]="rows">
<div class="row" *ngFor="let row of rows">
{{row.value}}
<div [dragula]="'bag2'" [dragulaModel]="row.columns">
<div class="column" *ngFor="let column of row.columns">
{{column.value}}
</div>
</div>
</div>
</div>
试试这个:
<div dragula="myBag" [dragulaModel]="rows" class="iAmContainer">
<row *ngFor="let row of rows" dragula="myBag" [dragulaModel]="row?.columns" class="iAmRow">
<column *ngFor="let column of row?.columns" class="iAmCol"></column>
</row>
</div>
我将 dragula="myBag"
设置为行和列,并在元素上设置 类。
现在 ngOnInit
使用类似这样的代码:
const bag: any = this.dragulaService.find('myBag');
if (bag !== undefined) this.dragulaService.destroy('myBag');
this.dragulaService.setOptions('myBag', {
revertOnSpill: true,
accepts: function (el, target, source, sibling) {
return !el.contains(target) &&
((el.className == 'iAmCol' && target.className == 'iAmRow') ||
(el.className == 'iAmRow' && target.className == 'iAmContainer'));
},
});
我使用元素和目标的 className
来确定它们是否兼容。