2016-10-20 5 views
1

У меня есть набор элементов, к которым я хотел бы зарегистрировать один обработчик событий. Я пытался зарегистрировать обработчик событий для каждого элемента в шаблоне, как показано ниже, хотя производительность не является адекватной, и я скучаю горсть этих событий, когда длина myLabels велика (> 1000)Angular2 регистрирует наблюдаемый обработчик событий по нескольким элементам в queryList

в .html

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

в .component.ts

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

Вместо этого, я хотел бы зарегистрировать эти события в качестве 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.cells является QueryList. С QueryList.toArray(), я получаю массив, где я могу получить доступ к каждому nativeElement как QueryList.toArray()[n].nativeElement

Как бы я создал наблюдаемом событие, для каждого элемента в cells?

ответ

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