私のユーザーは、キャンバス内でマウスでオブジェクトを移動(または回転)できる必要があります。マウスイベントが発生すると、最後のイベントまでのデルタ(方向と長さ)を計算するために画面座標が使用されます。特別何も...Angular2:マウスイベント処理(現在の位置に対する相対移動)
- マウスダウン(第1の座標取得)
- のMouseMove(n番目deltaXYによってオブジェクトを移動、deltaXYを計算し、座標取得)
- ステップ2と同様のmouseup(とのMouseMoveとのmouseupを停止イベント処理)
この一連のイベントの後、同じアクションを繰り返すことができます。
この古くなった例は、toRx
コールを削除した後、期待通りに機能します。しかし、ここで第1の座標にデルタが決定されます。ここではgithub.com:rx-draggable
は例からコードを適応させるために私の努力です:
@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;
}
});
}
...
}
それは、1サイクルの間だけ動作します。 mouseup
イベント後、私はこのエラーを得た:
Uncaught EXCEPTION: Error during evaluation of "mousemove"
ORIGINAL EXCEPTION: ObjectUnsubscribedError
ERROR CONTEXT: EventEvaluationErrorContext
mousemove
サブスクリプションのキャンセルは動作しません。次のすべてのマウスでエラーが繰り返されます。
私のコードに何が間違っていると思いますか?この問題を解決するためのエレガントなアプローチがありますか?
おかげで素晴らしい作品:ここ
は一例です。 –
あなたの古いコードは、 'remove'を使っていませんでした。何故でしょうか?あなたはangle2で反応性のものを学ぶ良いリソースを知っていますか? –
@Meikoええと、私は 'remove'をテストしませんでしたが、これの前に使っていました。私は良い資源がなく、遊んでいる間だけ学んでいます:)。同意していただきありがとうございます。うれしいことに – PierreDuc