Ich versuche Drag und Drop in RxJS zu implementieren. Ich habe einen DOM-Knoten mit der ID draggable
, die herumgezogen werden kann. Die Verwendung der Standardprozedur per Drag & Drop funktioniert wie erwartet.RxJS: Erweiterte Drag & Drop - Verhindern Abonnement im Operator
Aber ich habe versucht, Drag & Drop zu verbessern und das ist, wo die Dinge kompliziert werden. Ich versuche, die Hintergrundfarbe des Elements nach dem Ziehen zu ändern und es nach dem Ablegen wieder zu ändern.
In meinem Ansatz verwende ich switchMap
, um die Ergebnisse des Mausbewegungsereignisses in meine Observable abzubilden, die durch das Mouse-Down-Ereignis ausgelöst wird. Aber da ich das mouse up-Ereignis verwende, um die switchMap
ed Observable (mm$
im Beispiel unten) zu vervollständigen, habe ich keine Möglichkeit, über das Abschluss-Ereignis der inneren Observablen benachrichtigt zu werden, außer wenn ich es unter dem Operator switchMap
abonniere.
Ich weiß, dass das Abonnieren innerhalb eines Betreibers weit von guter Praxis entfernt ist und zu Speicherlecks führen kann. Aber was kann ich noch tun? Wie kann das besser gemacht werden?
Fiddle: 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';
});
Vielen Dank für Ihre Idee zu teilen. Ich habe herausgefunden, wie ich mein Problem mit dem Entwurf in dem anderen Beitrag lösen kann. Siehe diese Geige: https://jsfiddle.net/b11gaewt/ Danke für die Antwort. Ich werde Ihre Antwort als Lösung markieren, schlage aber allen interessierten Lesern vor, sich auch meine eigene Lösung anzuschauen: http://stackoverflow.com/a/39397186/434227 – dotcs