我希望能够从可滚动的内部div而不仅仅是窗口目标滚动时检测事件。
例如我有一个监听滚动事件的指令,在这里我需要将'host:'(window:scroll)'更改为其他内容。
import {Directive, Output, EventEmitter} from '@angular/core';
@Directive({
selector: '[infinite-scroll]',
host: {'(window:scroll)': 'track($event)'},
})
export class InfiniteScrollerDirective {
@Output() scrolled = new EventEmitter();
track(event: Event) {
this.scrolled.emit({
value: event
});
}
}
我在我的组件中使用它作为带有“滚动”输出的无限滚动指令。
<div infinite-scroll (scrolled)="onScroll($event.value)">
<table class="table">
<thead>
</thead>
<tbody>
</tbody>
</table>
</div>...
事件就在这里。
onScroll(event: UIEvent) {
}
答案 0 :(得分:4)
Angular 2.0 RC
export class YourComponent {
@HostListener('scroll', ['$event']) private onScroll($event:Event):void {
console.log($event.srcElement.scrollLeft, $event.srcElement.scrollTop);
};
}
答案 1 :(得分:4)
我不确定为什么这里的每个人都试图弄乱@HostListener。在处理页面级事件时,它绝对是必需的,但不是子元素。您可以使用Angular 2事件侦听器,而不是使用JQuery样式事件绑定。如果您正在使用inner-div,那么您需要做的就是使用如下所示的回调方法在div上添加scroll事件侦听器:
HTML:
<div (scroll)="onScroll($event)">
</div>
打字稿:
onScroll(event): void {
// Interpret the scroll event
// Do stuff on inner div scroll
}
答案 2 :(得分:1)
手动添加EventListner
的最简单方法 document.addEventListener('scroll', (e)=>{
let el = this.elementRef.nativeElement;
if(el.contains(e.target)){
// do something
}
}, true);
最后的“true”告诉浏览器在发送时捕获事件,即使该事件通常不起泡,如更改,聚焦和滚动。
无法将useCapture参数传递给@HostListener或renderer.listen。
当您销毁组件时,不要忘记删除此侦听器。
答案 3 :(得分:0)
根据此'in-viewpoint'
Directive,您可以附加到自定义元素:
const CUSTOM_ELEMENT = this.elementRef.nativeElement || window;
this.scrollWindow = Observable
.fromEvent(CUSTOM_ELEMENT, 'scroll').debounceTime(50).subscribe((event) => {
this.fireScrollEvent();
});
答案 4 :(得分:0)
要捕获div
事件的scroll
应该可滚动。
使其可滚动
overflow: scroll
添加到样式。完成上述操作后,您将从任何div
获取滚动事件。