Il mio utente deve essere in grado di spostare (o ruotare) un oggetto con il mouse su una tela. Quando si verificano eventi del mouse, le coordinate dello schermo vengono utilizzate per calcolare il delta (direzione e lunghezza) dell'ultimo evento. Niente di speciale ...Angolare2: gestione evento del mouse (movimento relativo alla posizione corrente)
- mousedown (vedere la prima coordinata)
- mousemove (ottenere ennesima coordinare, calcolare deltaXY, spostare l'oggetto da deltaXY)
- mouseup (uguale al passaggio 2 e arrestare il mousemove e mouseup gestione evento)
Dopo questa catena di eventi dovrebbe essere possibile ripetere la stessa azione.
Questo esempio obsoleto funziona come previsto, dopo aver rimosso le chiamate toRx
. Ma qui il delta per la prima coordinata è determinata: github.com:rx-draggable
Ecco il mio sforzo per adattare il codice dall'esempio:
@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;
}
});
}
...
}
Funziona solo per un ciclo. Dopo l'evento mouseup
ho ottenuto questo errore:
Uncaught EXCEPTION: Error during evaluation of "mousemove"
ORIGINAL EXCEPTION: ObjectUnsubscribedError
ERROR CONTEXT: EventEvaluationErrorContext
L'annullamento della sottoscrizione mousemove
non funziona. L'errore si ripete per tutti i seguenti mousemoves.
Hai un'idea di cosa c'è di sbagliato nel mio codice? C'è un diverso approccio elegante per risolvere questo problema?
grazie, funziona alla grande. –
il tuo vecchio codice, che usa 'remove' non ha funzionato, hai qualche idea del perché? Conosci una buona risorsa per apprendere quella roba reattiva con angular2? –
@Meiko Mmm, non ho provato il 'remove', ma l'ho usato prima in questo modo e ha funzionato. Non ho buone risorse e sto imparando solo giocando :). Grazie per aver accettato. Contento di aver potuto aiutare – PierreDuc