Mój użytkownik powinien móc przenosić (lub obracać) obiekt za pomocą myszy w obszarze roboczym. Kiedy wystąpią zdarzenia myszy, współrzędne ekranu są używane do obliczenia delty (kierunku i długości) do ostatniego zdarzenia. Nic specjalnego ...Angular2: obsługa zdarzeń myszy (ruch względem aktualnej pozycji)
- mouseDown (get pierwsza współrzędna)
- mousemove (Get nth współrzędnych, oblicz deltaXY przesunąć obiekt o deltaXY)
- mouseUp (taki sam jak krok 2 i zatrzymać mouseMove i mouseUp obsługa zdarzeń)
Po tym łańcuchu wydarzeń powinno być możliwe powtórzenie tego samego działania.
Ten przestarzały przykład działa zgodnie z oczekiwaniami po usunięciu wywołań toRx
. Ale tutaj delta do pierwszego współrzędnych jest określana: github.com:rx-draggable
Oto mój wysiłek, aby dostosować kod z przykładu:
@Component({
selector: 'home',
providers: [Scene],
template: '<canvas #canvas id="3dview"></canvas>'
})
export class Home {
@ViewChild('canvas') canvas: ElementRef;
private scene: Scene;
private mousedrag = new EventEmitter();
private mouseup = new EventEmitter<MouseEvent>();
private mousedown = new EventEmitter<MouseEvent>();
private mousemove = new EventEmitter<MouseEvent>();
private last: MouseEvent;
private el: HTMLElement;
@HostListener('mouseup', ['$event'])
onMouseup(event: MouseEvent) { this.mouseup.emit(event); }
@HostListener('mousemove', ['$event'])
onMousemove(event: MouseEvent) { this.mousemove.emit(event); }
constructor(@Inject(ElementRef) elementRef: ElementRef, scene: Scene) {
this.el = elementRef.nativeElement;
this.scene = scene;
}
@HostListener('mousedown', ['$event'])
mouseHandling(event) {
event.preventDefault();
console.log('mousedown', event);
this.last = event;
this.mousemove.subscribe({next: evt => {
console.log('mousemove.subscribe', evt);
this.mousedrag.emit(evt);
}});
this.mouseup.subscribe({next: evt => {
console.log('mousemove.subscribe', evt);
this.mousedrag.emit(evt);
this.mousemove.unsubscribe();
this.mouseup.unsubscribe();
}});
}
ngOnInit() {
console.log('init');
this.mousedrag.subscribe({
next: evt => {
console.log('mousedrag.subscribe', evt);
this.scene.rotate(
evt.clientX - this.last.clientX,
evt.clientY - this.last.clientY);
this.last = evt;
}
});
}
...
}
To działa tylko na jednym cyklu. Po zakończeniu imprezy mouseup
mam ten błąd:
Uncaught EXCEPTION: Error during evaluation of "mousemove"
ORIGINAL EXCEPTION: ObjectUnsubscribedError
ERROR CONTEXT: EventEvaluationErrorContext
Anulowanie subskrypcji mousemove
nie działa. Błąd jest powtarzany dla wszystkich następujących po nim ruchów myszy.
Czy masz pojęcie, co jest nie tak z moim kodem? Czy istnieje inne eleganckie podejście do rozwiązania tego problemu?
dzięki, działa świetnie. –
Twój stary kod, który używa polecenia "usuń", nie działa, masz pojęcie, dlaczego? Czy znasz dobry zasób, aby nauczyć się tego reaktywnego materiału za pomocą angular2? –
@Meiko Mmm, nie przetestowałem 'remove', ale użyłem go wcześniej i tak działało. Nie mam dobrych zasobów i dopiero się uczę podczas gry :). Dziękuję za przyjęcie. Cieszę się, że mogę pomóc – PierreDuc