2016-10-20 9 views
1

私は単一のイベントハンドラを登録したい要素のコレクションを持っています。パフォーマンスが十分ではないとmyLabelsの長さが大きい場合、私は.htmlqueryList内の複数のアイテムのAngular2レジスタのobservableイベントハンドラ

に(> 1000)

をこれらのイベントの一握りを逃すが、私は、以下のようなテンプレート内の各要素にイベントハンドラを登録しようとしました.component.ts

... 
OnMouseEnter(event) { 
    console.log('mouse entered') 
} 

<template ngFor let-row [ngForOf]=myLabels> 
    <div #cell (mouseenter)=onMouseEnter($event)>...</div> 
</template> 

代わりに、私はObservableストリームとして、これらのイベントを登録したいと思います。

私の.component.ts;

export class MyComponent { 
    @ViewChildren('cell') cells: ElementRef; 
    public mouseMoves$: Observable<MouseEvent>; 
    ... 
    onFrameLoad(): void { 
    this.mouseMoves$ = Observable.fromEvent(this.cells.nativeElement, 'mousemove'); 
    } 
} 

this.cellsQueryListあるので、これは動作しませんが。 QueryList.toArray()で、私は私がcellsの各要素のイベントの観測を設定します各nativeElement

QueryList.toArray()[n].nativeElementのようなどのようにアクセスすることができます配列を取得しますか?

答えて

1

テンプレートは、細胞のみが含まれているので、なぜテンプレート上でマウスの動きを入れないで:

<template ngFor let-row [ngForOf]=myLabels (mouseenter)=onMouseEnter($event)> 
    <div #cell>...</div> 
</template> 

またはテンプレートは、イベントリスナーを取るのdivでラップしない場合:

<div (mouseenter)=onMouseEnter($event)> 
    <template ngFor let-row [ngForOf]=myLabels> 
    <div #cell>...</div> 
    </template> 
</div> 
+0

どのようにイベントを特定のセルに関連付けるのですか? –

+1

'event.target'には、探している要素(またはその要素の中に入れ子になっている要素)が含まれているはずです。あなたは最終的にその親をチェックすることで細胞を見つけることができます。 https://developer.mozilla.org/en/docs/Web/Events/mouseover – martin

+0

前述のように、event.target(またはcurrentTarget)は要素を提供します。ただし、元のハンドラも要素を取得せず、イベントのみを取得していました。 要素のデータ(添付されたコンポーネント)を保持する必要がある場合は、 'exportAs' – Meir

関連する問題