Is there an easy way to track the browser scroll position and notify more than a single component about it?
Use case: On scroll I want to be able to change classes of various elements on the page based upon where I am. In a previous version of angular it was somewhat possible through a plugin (same for jQuery). Of course, there is the option of writing bare JS to initialize it on application start and emit an event, but that sounds dirty, and event emission is pretty expensive for this type of thing.
What are my options here?
UPDATE (after suggestions):
Here is what I tried:
I created a component:
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);
}
}
added an attribute to the main directive of an app:
<priz-app track-scroll>
and added the component as one of the providers in the top component:
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]
})
Still nothing...
ANOTHER UPDATE:
Moved track-scroll
to one of the div elements of the main template:
<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>
And now the app loads with a completely empty screen.
FUN FUN FUN...
FINAL SOLUTION (that worked for me).
- Define a directive:
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);
}
}
- Add it as a directive everywhere that uses it:
directives: [TrackScrollDirective]
- Add the attribute to each element we want to track the event:
<div class="col-md-12" track-scroll>
See Question&Answers more detail:
os