I want to execute some code every time the page changes.
I could add add an ngOnDestroy
method to every page. It appears that I could use Ionic 2 page lifec
As of Ionic 3.6, you can use the App component to subscribe to application-wide page change events, as documented in : https://ionicframework.com/docs/api/components/app/App/
For example, if you'd like to track every view change in Google Analytics using the GA cordova plugin, you could amend your app.component.ts like this :
constructor(private app: App, private platform: Platform, private ga: GoogleAnalytics, ...) {
this.platform.ready().then(() => {
this.ga.startTrackerWithId('UA-XXX').then(() => {
this.app.viewDidEnter.subscribe((evt) => {
// evt.instance is the Ionic page component
this.ga.trackView(evt.instance.title);
});
}).catch(e => console.log('Doh', e));
}
}
In Ionic2+ you can simply subscribe to the event you want to execute your code on as follows:
this.navCtrl.ionViewWillUnload.subscribe(view => {
console.log(view);
});
You can subscribe to all the Lifecycle Events
You can use plain old Javascript to be placed in app.component.ts. Assuming that you use Ionic2-RC0:
import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from 'ionic-native';
import { YourPage } from '../pages/yourpage/yourpage';
@Component({
template: `<ion-nav [root]="rootPage"></ion-nav>`
})
export class MyApp {
rootPage = YourPage;
constructor(platform: Platform) {
platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
StatusBar.styleDefault();
window.addEventListener('load', () =>{
console.log('page changed');
});
});
}
Every time you change page using the NavController, you'll have page changed
printed out in the console.
Ionic2
doesn't use Angular2's Router
. They have their own implementation NavController
.
I see that you can subscribe to Angular 2 Router events. How do I translate that for use in Ionic 2?
You can merge all the NavController Events
and subscribe to it.
allEvents = Observable.merge(
this.navController.viewDidLoad,
this.navController.viewWillEnter,
this.navController.viewDidEnter,
this.navController.viewWillLeave,
this.navController.viewDidLeave,
this.navController.viewWillUnload);
allEvents.subscribe((e) => {
console.log(e);
});
Another option would be to create a super class where you can use the ionViewDidUnload
method (or any other lifecycle hook) like this:
import { Events } from 'ionic-angular';
export class BasePage {
constructor(public eventsCtrl: Events) { }
ionViewDidEnter() {
this.eventsCtrl.publish('page:load');
}
ionViewDidUnload() {
this.eventsCtrl.publish('page:unload');
}
}
Then in every page you just need to extend
that BasePage
@Component({
templateUrl: 'build/pages/my-page/my-page.html',
})
export class MyPage extends BasePage {
constructor(private platform: Platform,
private nav: NavController,
private menuCtrl: MenuController,
...,
eventsCtrl: Events) //notice that this one does not have the private/public keyword
{
// Due to an issue in angular, by now you must send the dependency to the super class
// https://github.com/angular/angular/issues/5155
super(eventsCtrl);
//...
}
And then, you can add a method like this one in the main app.ts
file to respond to those events:
private initializeEventHandlers() {
this.events.subscribe('page:load', () => {
// your code...
});
this.events.subscribe('page:unload', () => {
// your code...
});
}
1st thing Router is present in @angular/router
module.
And for listening route change event you can place subscription on router changes
object.
Code
class MyRouteEventClass {
constructor(private router: Router) {
router.changes.subscribe((val) => {
/* Awesome code here */
}
)
}
}