Comment implémenter un div draggable dans Angular 2 en utilisant Rx

J'ai essayé d'obtenir un déplaçable div de travail à l'aide Angulaire 2. Je suis en utilisant cet exemple de la angular2-exemples repo comme un point de départ, n'est vraiment réglage du code pour tenir compte de la suppression de la toRx() méthode. Le code fonctionne, mais il ne tient pas compte de mouseout événements. Cela signifie que si je clique sur un Déplaçable div, et déplacez la souris lentementla div se déplace avec la souris. Mais si je bouge la souris trop rapide, un mouseout événement est envoyé à la place d'un mousemove de l'événement, et ce déplacement s'arrête.

Comment puis-je garder le glisser passe après que la souris est déplacée jusqu'à présent qu'un mouseout événement est déclenché? J'ai essayé de fusionner les mouseout flux d'événements avec la mousemovede sorte que, mouseout événements sont traités comme mousemovemais qui ne fonctionne pas.

Je suis en utilisant Angulaire 2.0.0-bêta.12.

import {Component, Directive, HostListener, EventEmitter, ElementRef, OnInit} from 'angular2/core';
import {map, merge} from 'rxjs/Rx';
@Directive({
selector: '[draggable]'
})
export class Draggable implements OnInit {
mouseup = new EventEmitter();
mousedown = new EventEmitter();
mousemove = new EventEmitter();
mouseout = new EventEmitter();
@HostListener('mouseup', ['$event'])
onMouseup(event) {
this.mouseup.emit(event);
}
@HostListener('mousedown', ['$event'])
onMousedown(event) {
this.mousedown.emit(event);
return false; //Call preventDefault() on the event
}
@HostListener('mousemove', ['$event'])
onMousemove(event) {
this.mousemove.emit(event);
}
@HostListener('mouseout', ['$event'])
onMouseout(event) {
this.mouseout.emit(event);
return false; //Call preventDefault() on the event
}
constructor(public element: ElementRef) {
this.element.nativeElement.style.position = 'relative';
this.element.nativeElement.style.cursor = 'pointer';
map;
merge;
this.mousedrag = this.mousedown.map(event => {
return {
top: event.clientY - this.element.nativeElement.getBoundingClientRect().top
left: event.clientX - this.element.nativeElement.getBoundingClientRect().left,
};
})
.flatMap(
imageOffset => this.mousemove.merge(this.mouseout).map(pos => ({
top: pos.clientY - imageOffset.top,
left: pos.clientX - imageOffset.left
}))
.takeUntil(this.mouseup)
);
}
ngOnInit() {
this.mousedrag.subscribe({
next: pos => {
this.element.nativeElement.style.top = pos.top + 'px';
this.element.nativeElement.style.left = pos.left + 'px';
}
});
}
}
@Component({
selector: 'my-app',
template: `
<div draggable>
<h1>Hello, World!</h1>
</div>
`,
directives: [Draggable,],
})
export class AppComponent {
}

source d'informationauteur Chris | 2016-03-29