angular - 角度下降事件不一致
问题描述
当用户将一个元素拖放到另一个元素上时,我正在制作一个简单的网站,以便每个元素的内容相互交换。
但是,问题在于给出了(drop)="BuggyonDrop($event)"
拖动元素。$event
DragEvent
换句话说,如果我将<p id="unique0">
它拖放<p id="unique2">
到事件信息drop()
上<p id="unique0">
...
奇怪的是,当我这样做时console.log(event.target.id)
,结果是unique2
.
此外,如果我将调试器放在下面,console.log
结果很好(按预期工作)。
所以这真的很奇怪和不一致。
我不得不花费数小时寻找原因和解决方法。原来不使用*ngFor
是一个解决方案(必须手动一个一个地放置数据绑定值)。
我已经在chrome和opera上测试过...
console.log("BuggyonDrop")
console.log(event)
console.log(event.target)
console.log(event.target.id)
正如你所看到的,event.target
正在给予unique3
元素,但当我这样做时,event.target.id
它正在给予我unique0
不太确定为什么会这样
解决方案
默认情况下,ngFor
循环按值跟踪项目。在您的代码中,您交换拖放操作中涉及的两个项目的值。循环可能会交换循环中的项目索引以将相同的值保持在相同的位置。
为确保ngFor
循环索引引用正确的目标元素,您应该按索引跟踪项目:
*ngFor="let id of good.idArray; index as i; trackBy: trackByIndex"
其中trackByIndex
是组件类的一个方法:
public trackByIndex(index, item) {
return index;
}
有关演示,请参阅您的 stackblitz 的此修改版本。您会注意到我重命名了一些属性以反映拖放不再是错误的事实......
推荐阅读
- c# - 构建 Lambda 函数时未找到 AWS KinesisEvents 包
- reactjs - TypeScript 说空值是不可分配的,但我已经检查了可空性
- javascript - 在chartjs中设置最小值和最大值不起作用
- java - iTextPDF(版本 5)超链接未链接到正确的位置
- python - if 语句中的 .lower 函数会中断正确的输入吗?
- python - Transcypt 编译在 pathlib 中使用 python 内置属性函数失败
- ssl - URL 的哪些部分受 TLS 保护?
- php - PHP 7.2 到 PHP 7.4 升级字符串验证创建服务器性能问题
- javascript - d3 - 来自 nest() 和 sum() 的整数
- javascript - 如何使用 Axios 并获得婴儿车的响应