私はこの作業をしていますPlunker例、マウスをドラッグしてカードを選択することができます。 IMG#でカード - 私の問題は、コードがバグの多くを持っていると私は私が(img1とimg2を修正したいこれに類似 何かDemoコンポーネントのAngular 4で、より優れたMouseEvent実装を行うにはどうすればよいですか?
ここで何かをしたいということです
2を前にクリックしたとき)、別のことは、マウスを速くドラッグするとカードが選択されないことがあることです。
は、ここに私のコンポーネントのコードの読み取りのための
export class App { private dragStart:number = 0; private dragOver:number = 0; public users:Array<{id?: number; name: string; admin: boolean;}> = [ { name: 'Alexis Wursten', admin: false }, { name: 'Janco Boscan', admin: true }, { name: 'Noemi Iturralde', admin: false }, ]; public added: string[] = []; x1 = 0; y1 = 0; x2 = 0; y2 = 0; @ViewChild('selector') selector: ElementRef; constructor(private renderer: Renderer2) { } isRectangeVisible = false; isMouseDown = false; @HostListener('mousedown', ['$event']) onMouseDown(ev) { this.dragStart = ev.clientY; this.isMouseDown = true; } @HostListener('document:mouseup', ['$event']) onMouseUp(ev) { this.dragStart = 0; this.dragOver = 0; this.renderer.setStyle(this.selector.nativeElement, 'display', 'none'); this.isRectangeVisible = false; this.isMouseDown = false; } @HostListener('document:mousemove', ['$event']) onMouseMove(ev) { if(!this.isRectangeVisible && this.isMouseDown){ this.renderer.setStyle(this.selector.nativeElement, 'display', 'block'); this.x1 = ev.clientX; this.y1 = ev.clientY; this.isRectangeVisible = true; } this.x2 = ev.clientX; this.y2 = ev.clientY; this.reCalc(); } reCalc() { const x3 = Math.min(this.x1, this.x2); const x4 = Math.max(this.x1, this.x2); const y3 = Math.min(this.y1, this.y2); const y4 = Math.max(this.y1, this.y2); this.renderer.setStyle(this.selector.nativeElement, 'left', x3 + 'px'); this.renderer.setStyle(this.selector.nativeElement, 'top', y3 + 'px'); this.renderer.setStyle(this.selector.nativeElement, 'width', x4 - x3 + 'px'); this.renderer.setStyle(this.selector.nativeElement, 'height', y4 - y3 + 'px'); } onSelecUser(item) { if(this.added.indexOf(item.name)===-1) { // or compare by id this.added = this.added.concat([item.name]); } else { this.added = this.added.filter((x) => item.name!==x); // or compare by id } item.selected = !item.selected ? true : false; } onMouseOver(ev, item) { if(ev.which!==1) { return false; } ev.preventDefault(); if(ev.type==='mouseenter' && !item.selected) { this.dragOver = ev.clientY - this.dragStart > 0 ? 1:-1; this.onSelecUser(item); return false; } if(ev.type==='mouseleave') { if(this.dragOver===1 && ev.clientY < ev.target.offsetTop && item.selected) { console.log('desel...', item); this.onSelecUser(item); return false; } if(this.dragOver===-1 && ev.clientY > ev.target.offsetTop && item.selected) { console.log('desel...', item); this.onSelecUser(item); return false; } } } }
おかげです。
ありがとうございます、私を大いに助けてくれました。私はまだノーベルであり、上級者から何かを知ることは素晴らしいことです。 通常のクリックでカードを選択するにはどうすればいいですか?それと完璧になるでしょう。 –
デモのようなものは、カード以外のカードの選択を解除し、矩形と通常のクリックで選択します。 –
は、ユーザーを選択/選択解除するためのオプションを追加した新しいプランカのリンクで、私の答えを更新しました。 – mtim