【发布时间】:2016-07-27 20:53:50
【问题描述】:
是否有一种简单的方法可以跟踪浏览器滚动位置并通知多个组件?
用例:在滚动时,我希望能够根据我所在的位置更改页面上各种元素的类别。在以前版本的 Angular 中,通过插件(对于 jQuery 也是如此)在某种程度上是可能的。当然,也可以选择编写裸 JS 来在应用程序启动时对其进行初始化并发出事件,但这听起来很脏,而且事件发出对于这类事情来说是相当昂贵的。
我有什么选择?
更新(根据建议):
这是我尝试过的:
我创建了一个组件:
import {Component} from "angular2/core";
@Component({
selector: '[track-scroll]',
host: {'(window:scroll)': 'track($event)'},
template: ''
})
export class TrackScrollComponent {
track($event) {
console.debug("Scroll Event", $event);
}
}
在应用的主指令中添加了一个属性:
<priz-app track-scroll>
并将该组件添加为顶部组件中的提供者之一:
import {TrackScrollComponent} from "../../shared/components/track-scroll.component";
@Component({
selector: 'priz-app',
moduleId: module.id,
templateUrl: './app.component.html',
directives: [ROUTER_DIRECTIVES, SecureRouterOutlet, AppHeader, TrackScrollComponent],
providers: [AuthenticationService]
})
还是什么都没有……
另一个更新:
将 track-scroll 移动到主模板的 div 元素之一:
<div class="container-fluid" track-scroll>
<div class="row">
<div class="col-md-12">
<app-header></app-header>
<secure-outlet signin="Login" unauthorized="AccessDenied"></secure-outlet>
</div>
</div>
</div>
现在,应用加载时屏幕完全为空。 有趣有趣有趣...
最终解决方案(对我有用)。
- 定义指令:
import {Directive} from "angular2/core";
@Directive({
selector: '[track-scroll]',
host: {'(window:scroll)': 'track($event)'}
})
export class TrackScrollDirective {
track($event: Event) {
console.debug("Scroll Event", $event);
}
}
- 将其作为指令添加到任何使用它的地方:
directives: [TrackScrollDirective]
- 将属性添加到我们要跟踪事件的每个元素:
<div class="col-md-12" track-scroll>
【问题讨论】:
-
下一个问题是,将其传播到另一个组件的最佳方式是什么?
-
不确定您所说的传播是什么意思?您可以使用
@Output()发出并将其绑定到另一个组件的@Input()。我在我的回答中添加了关于directives: [...]的评论。 -
基本上,我想在其他组件中使用此信息。我必须通过
EventEmitter来做吗? -
是的,你可以在接收组件上使用
@Output() scrollPos:EventEmitter和@Input() scrollPos,如果它们是父子组件,可以在模板中绑定。 -
为此打开了单独的问题:stackoverflow.com/questions/36471927/…
标签: angular typescript events scroll