У меня есть набор элементов, к которым я хотел бы зарегистрировать один обработчик событий. Я пытался зарегистрировать обработчик событий для каждого элемента в шаблоне, как показано ниже, хотя производительность не является адекватной, и я скучаю горсть этих событий, когда длина 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
?
Как связать событие с конкретной ячейкой? –
Я думаю, что 'event.target' должен содержать элемент, который вы ищете (или любой вложенный элемент внутри этого элемента). Вы можете найти ячейку, проверив ее родителей. https://developer.mozilla.org/en/docs/Web/Events/mouseover – martin
Как уже упоминалось, event.target (или это currentTarget) предоставит вам элемент. Однако обратите внимание, что ваш исходный обработчик также не получил элемент, а только событие. Если вам нужно получить данные элемента (прикрепленный компонент), вы можете посмотреть в 'exportAs' – Meir