TypeError: Cannot read property 'next' of null
import { NavService } from '../../providers/services/nav-service/nav-service';
@Component({
selector: 'ion-header',
providers: [NavService],
template: `
<ion-navbar>
<ion-title>{{navService.getCurrentName()}}</ion-title>
<ion-buttons start>
<button (click)="navService.goHome()">
<span primary showWhen="ios">Cancel</span>
<ion-icon name="md-close" showWhen="android,windows"></ion-icon>
</button>
</ion-buttons>
</ion-navbar>
`
})
import { Platform } from 'ionic-angular';
import { Observable } from 'rxjs/Observable';
import { Injectable, ViewChild } from '@angular/core'
@Injectable()
export class NavService {
private dismissObserver: any
public dismiss: any
constructor (
private authService: AuthService,
private platform: Platform
) {
this.dismissObserver = null;
this.dismiss = Observable.create(observer => {
this.dismissObserver = observer;
});
}
public goHome():void {
this.dismissObserver.next(true);
}
@Component({
providers: [NavService]
})
export class MyApp {
@ViewChild(Nav) navController: Nav
constructor(
public navService: NavService
) {
this.initializeApp()
}
initializeApp() {
this.platform.ready().then(() => {
StatusBar.styleDefault()
this.setRoot()
this.navController.setRoot(HomePage);
this.navService.dismiss.subscribe((event) => {
console.log ("event", event);
this.navController.setRoot(HomePage)
})
})
}
ionicBootstrap(MyApp, [])
Btw, I am using this "tutorial":
Ionic2, inject NavController to Injectable Service
The code in Observable.create
where you assign dismissObserver
is called when dismiss
is subscribed. So if you call goHome
before that subscription, dismissObserver
is null by that time and you get the error
Anyway, what you're implementing with dismiss
and dismissObserver
is the concept of a Subject
. Just replace your NavService constructor and goHome
by:
constructor (
private authService: AuthService,
private platform: Platform
) {
this.dismiss = new Subject();
}
public goHome():void {
this.dismiss.next(true);
}
and you're fine: You may miss value(s) if your subscription comes after it, but no error is thrown. Try replacing Subject
by BehaviorSubject
to cache one value for subscriptions that come after the emission.
EDIT: I forgot to mention you need to import { Subject } from 'rxjs/Subject';
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