Sai*_*aif 3 html typescript angular-material angular
考虑以下组件模板,我试图实现重新排序角度材料 2 和简单 li 标签的列表元素的能力。
此功能非常适合 li-tag 标签,但在 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>
Run Code Online (Sandbox Code Playgroud)
调用函数:
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';
}
Run Code Online (Sandbox Code Playgroud)
问题截图:
如屏幕截图所示,当我拖动任何 md-list-item 时,浏览器甚至会从父组件开始拖动所有内容。
使用event.currentTarget而不是event.target因为在您需要移动时md-list-item嵌套了divmd-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';
}
Run Code Online (Sandbox Code Playgroud)
并禁用涟漪效应
<md-list-item [disableRipple]="true"
Run Code Online (Sandbox Code Playgroud)
只能拖动一项
| 归档时间: |
|
| 查看次数: |
6030 次 |
| 最近记录: |