【发布时间】:2017-05-09 08:49:05
【问题描述】:
【问题讨论】:
-
通常您可以应用 onclick、onsubmit 等事件。在 Angular 中,等价物通常只是从事件名称中删除“on”并添加 ()。例如(点击)、(提交)等... :)
标签: html css angular typescript scrollbar
【问题讨论】:
标签: html css angular typescript scrollbar
// @HostListener('scroll', ['$event']) // for scroll events of the current element
@HostListener('window:scroll', ['$event']) // for window scroll events
onScroll(event) {
...
}
或
<div (scroll)="onScroll($event)"></div>
【讨论】:
'window:resize')。您可以实现ngDoCheck() 并在那里轮询大小。虽然这可能很昂贵,因此如果您可以依赖不太频繁的事件来使用此类事件来轮询大小,那将是首选。
您可以使用@HostListener 装饰器。适用于 Angular 4 及更高版本。
import { HostListener } from '@angular/core';
@HostListener("window:scroll", []) onWindowScroll() {
// do some stuff here when the window is scrolled
const verticalOffset = window.pageYOffset
|| document.documentElement.scrollTop
|| document.body.scrollTop || 0;
}
【讨论】:
对于 Angular 4,工作解决方案是在组件内部进行
@HostListener('window:scroll', ['$event']) onScrollEvent($event){
console.log($event);
console.log("scrolling");
}
【讨论】:
(scroll)="onScrollEvent($event) 这个。
收听window:scroll 事件以进行窗口/文档级滚动和元素的scroll 事件以进行元素级滚动。
@HostListener('window:scroll', ['$event'])
onWindowScroll($event) {
}
或
<div (window:scroll)="onWindowScroll($event)">
@HostListener('scroll', ['$event'])
onElementScroll($event) {
}
或
<div (scroll)="onElementScroll($event)">
如果宿主元素本身不可滚动,@HostListener('scroll', ['$event']) 将不起作用。
【讨论】:
import { HostListener } from '@angular/core';
<div (window:scroll)="onWindowScroll($event)">,清晰,简单,对我来说就像一个魅力。谢谢老哥!
要捕获滚动事件并查看调用了哪个滚动事件,您必须使用主机侦听器来观察滚动行为,然后在主机侦听器下面的函数中检测到这个东西。
currentPosition = window.pageYOffset;
@HostListener('window:scroll', ['$event.target']) // for window scroll events
scroll(e) {
let scroll = e.scrollingElement.scrollTop;
console.log("this is the scroll position", scroll)
if (scroll > this.currentPosition) {
console.log("scrollDown");
} else {
console.log("scrollUp");
}
this.currentPosition = scroll;
}
【讨论】:
替代@HostListener 并在元素上滚动输出我建议使用RxJS 中的fromEvent,因为您可以将它与filter() 和distinctUntilChanges() 链接起来,并且可以轻松地跳过洪水冗余事件(和变更检测)。
这是一个简单的例子:
// {static: true} can be omitted if you don't need this element/listener in ngOnInit
@ViewChild('elementId', {static: true}) el: ElementRef;
// ...
fromEvent(this.el.nativeElement, 'scroll')
.pipe(
// Is elementId scrolled for more than 50 from top?
map((e: Event) => (e.srcElement as Element).scrollTop > 50),
// Dispatch change only if result from map above is different from previous result
distinctUntilChanged());
【讨论】:
检查此 URL 上提及的多个示例。
我会推荐方法3,
https://itnext.io/4-ways-to-listen-to-page-scrolling-for-dynamic-ui-in-angular-ft-rxjs-5a83f91ee487
@Component({
selector : 'ngx-root',
templateUrl : './app.component.html',
styleUrls : [ './app.component.scss' ],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AppComponent implements OnDestroy {
destroy = new Subject();
destroy$ = this.destroy.asObservable();
constructor() {
fromEvent(window, 'scroll').pipe(takeUntil(this.destroy$))
.subscribe((e: Event) => console.log(this.getYPosition(e)));
}
getYPosition(): number {
return (e.target as Element).scrollTop;
}
ngOnDestroy(): void {
this.destroy.next();
}
}
不过方法4还不错。
【讨论】: