我知道这个最初的问题被问到已经有好几年了,但在撰写本文时,Kendo 仍然不支持原生的“句柄”机制。但是,有一种方法可以实现“句柄”功能,我将在这里写下它,希望将来有人会觉得这很有帮助。 注意我不认为这是正确的解决方案,因为我认为 Kendo 的 API 应该有这个功能。
使用鼠标
防止拖动开始
当我们开始在小部件上拖动时,我们只想在鼠标悬停在有效句柄上时进行拖动。
在你的组件代码中定义一个标志。
/** whether we should allow dragging **/
allowDrag: boolean = false;
在kendo-sortable 元素上监听dragStart
<kendo-sortable (dragStart)="onDragStart($event)">
当标志为真时停止默认dragStart event
/** handles the starting of dragging */
onDragStart(e: DragStartEvent): void {
if (!this.allowDrag) {
e.preventDefault();
return;
}
}
鼠标悬停和鼠标离开切换
当您的鼠标悬停在句柄元素上时,启用该标志。当鼠标离开元素时,禁用标志。
<div (mouseover)="allowDrag = true" (mouseleave)="allowDrag = false" class="drag-handle"></div>
纳入触摸屏用户
上述方法的原理是只监听句柄上的mouseover 和mouseleave 事件,而忽略其他一切。对于移动设备 - 这有点棘手,因为没有专门定义用户是否在适当位置进行拖动的鼠标位置。所以,我们必须添加一个监听器来处理元素,以及我们不想拖拽的所有其他非句柄元素。这种方法也可以用于鼠标点击,但我认为只附加到句柄元素是更好的方法。
注意:我还没有完全测试过这种方法,它可能并不适用于所有条件,并且可能无法按预期对所有用户起作用。
添加touchstart 事件
在你看来,听听触摸手柄
<div (touchstart)="allowDrag = true" (mouseover)="allowDrag = true"
(mouseleave)="allowDrag = false" class="drag-handle"></div>
还包括触摸所有非把手的东西
<div (touchstart)="allowDrag = false">
My non-draggable thing
</div>