working on angular2 application. I have RxJS timer instance that will push notification to user when used logged in. But it should not push notification if tab is not active then scheduler should pause/stop. It is also done.
But main thing is that I have added that window (focus, blur )event listener to ngOnInit(). I have tried to destroy it on ngOnDestroy() when we change page/component but though also it does not stop. When we came back to same page then second instance also started of that listener and there will be 2 scheduler instance now in my memory/scope.
So anyone have idea that how to remove/destroy window.listener on ngOnDestroy or any other place !
Code:
timerFlag: boolean = true;
private timer;
private sub: Subscription;
ngOnInit() {
this.sub = null;
this.timer = null;
console.log("home-init");
window.addEventListener('blur', this.disableTimer.bind(this), false);
window.addEventListener('focus', this.initializeTimer.bind(this), false);
}
disableTimer() {
if (this.sub !== undefined && this.sub != null) {
this.sub.unsubscribe();
this.timer = null;
}
}
initializeTimer() {
if (this.timerFlag) {
if (this.timer == null) {
this.timer = Observable.timer(2000, 5000);
this.sub = this.timer.subscribe(t => this.runMe());
}
}
}
runMe() {
console.log("notification called : " + new Date());
}
ngOnDestroy() {
console.log("Destroy timer");
this.sub.unsubscribe();
this.timer = null;
this.sub = undefined;
this.timerFlag = false;
window.removeEventListener('blur', this.disableTimer.bind(this), false);
window.removeEventListener('focus', this.initializeTimer.bind(this), false);
}
can anyone guide me how to destroy event listener instance so that when I come to same page next time no second instance will start.
I have tried to remove listener in ngOnInit as well before start of window listener.
1) I guess this should work:
ngOnInit() {
window.addEventListener('blur', this.disableTimer, false);
window.addEventListener('focus', this.initializeTimer, false);
}
disableTimer = () => { // arrow function
...
}
initializeTimer = () => { // arrow function
...
}
ngOnDestroy() {
window.removeEventListener('blur', this.disableTimer, false);
window.removeEventListener('focus', this.initializeTimer, false);
}
Plunker Example
2) Another way is to store your listener in variable because .bind
returns new function every time
disableTimerFn: EventListenerOrEventListenerObject;
ngOnInit() {
this.disableTimerFn = this.disableTimer.bind(this);
window.addEventListener('blur', this.disableTimerFn, false);
}
ngOnDestroy() {
window.removeEventListener('blur', this.disableTimerFn, false);
}
Plunker Example
3) But maybe is the best way is to use angular2 way:
@HostListener('window:blur', ['$event'])
disableTimer (event) { ... }
It will be automatically removed when component will be destroyed
Plunker Example
4) One more angular2 way is using Renderer
globalListenFunc: Function;
constructor(private renderer: Renderer) { }
ngOnInit() {
this.globalListenFunc = this.renderer.listenGlobal('window', 'click', this.onClick.bind(this))
}
onClick() {
alert('click');
}
ngOnDestroy() {
this.globalListenFunc(); // destroy listener
}
Plunker Example
See also
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With