【发布时间】:2016-09-01 19:50:30
【问题描述】:
我尝试在 RxJS 中实现拖放。我有一个 ID 为 draggable 的 DOM 节点,可以拖动它。通过使用标准程序拖放按预期工作。
但我尝试增强拖放功能,这就是事情变得复杂的地方。我尝试在拖动开始后更改元素的背景颜色,并在拖放后将其更改回来。
在我的方法中,我使用switchMap 将鼠标移动事件的结果映射到由鼠标按下事件触发的可观察对象中。但是由于我使用鼠标向上事件来完成switchMaped observable(在下面的示例中为mm$),我没有机会收到有关内部可观察对象完成事件的通知,除非我在switchMap 运营商。
我知道在运算符中订阅远非良好做法,并且可能导致内存泄漏。但我还能做什么?怎样才能做得更好?
小提琴:https://jsfiddle.net/djwfyxs5/
const target = document.getElementById('draggable');
const mouseup$ = Observable.fromEvent(document, 'mouseup');
const mousedown$ = Observable.fromEvent(target, 'mousedown');
const mousemove$ = Observable.fromEvent(document, 'mousemove');
const move$ = mousedown$
.switchMap(md => {
md.target.style.backgroundColor = 'yellow';
const {offsetX: startX, offsetY: startY} = md;
const mm$ = mousemove$
.map(mm => {
mm.preventDefault();
return {
left: mm.clientX - startX,
top: mm.clientY - startY
};
})
.takeUntil(mouseup$);
// Can the next line be avoided?
mm$.subscribe(null, null, () => {
md.target.style.backgroundColor = 'purple';
});
return mm$;
});
move$.subscribe((pos) => {
target.style.top = pos.top + 'px';
target.style.left = pos.left + 'px';
});
【问题讨论】:
标签: drag-and-drop rxjs rxjs5