Hi everyone,
Here is a small blog post where I needed to work on an Ionic v5 project where (Angular) events were/are not working anymore.
Context: Basically, I was working on the side-menu ‘starter’ where I wanted the side-menu to automatically update with the user’s username after logging in.
Beforehand, in order to use the Events
, it was as simple as:
import { Events } from '@ionic/angular';
And finally work on your logic, but this got removed in Ionic 5. You can see the changelog here: https://github.com/ionic-team/ionic/blob/45d03baf981d0e10eb1fe689908532adef2ba31d/BREAKING.md#events-1
In order to have similar result, create a new service, in our case EventsService
(using ionic generate service
) like this:
import {Injectable} from '@angular/core';
import {Subject} from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class EventsService {
private fooSubject = new Subject<any>();
publishSomeData(data: any) {
this.fooSubject.next(data);
}
getObservable(): Subject<any> {
return this.fooSubject;
}
}
In my case, I needed to publish the user’s id just after logging in to the side-menu component. After checking that the user was properly logged in, I was able to publish the data.
import { EventsService } from './events.service';
export class LoginPage implements OnInit {
constructor(
public events: EventsService,
) { }
login(username: string, password: string) {
[...] // login mechanism
this.events.publishSomeData({
userId: this.userIdToLogin
})
}
On the other side (in my other component), basically when the app gets instanciated, I will have an observable on the events
.
import { EventsService } from './events.service';
[...]
export class AppComponent implements OnInit {
constructor(
[...]
private events: EventsService
) {
this.initializeApp();
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
});
this.events.getObservable().subscribe((data) => {
console.log("Data received:", data);
this.reviewerService.getReviewer(data.userId).snapshotChanges().subscribe(res => {
this.userProfile = res.payload.toJSON();
});
})
}
And… you’re good to go!