Я делаю это стандартной практикой для обработки значений null / undefined из любого вида pub / sub
MySharedService
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
/* Other imports */
@Injectable()
export class MySharedService {
public message = new Subject<any>();
myData: MyDataInterface;
constructor(private apiServie: ApiService) {
this.apiService.getTestData().subscribe((response) => {
if(response){
this.myData = { ...response.body };
this.sendUpdate(this.myData);
console.log(this.myData);
}else console.log("I guess you could do some sort of handling in the else")
});
sendUpdate(message) {
this.message.next(message);
}
getUpdate(): Observable<any> {
return this.message.asObservable();
}
clearUpdate() {
this.message.next();
}
}
TestComponent
import { Component, OnInit } from '@angular/core';
import { MySharedService } from '../../../services/myshared.service';
import { Subscription } from 'rxjs/Subscription';
import 'rxjs/add/operator/takeWhile';
/* Other imports */
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.css']
})
export class TestComponent implements OnInit, OnDestroy {
subscription: Subscription;
private alive: boolean = true;
name: string;
/* Other variables here. */
constructor(private mySharedService: MySharedService) {
// Error here because myData has not been populated, yet.
this.subscription = this.mySharedService.getUpdate().takeWhile(() => this.alive).subscribe(message => {
if (message) {
this.name = message;
}
});
this.name = this.mySharedService.myData.name;
}
}
//Best practice to clean up observables
ngOnDestroy() {
this.updateService.clearUpdate();
this.subscription.unsubscribe();
this.alive = false;
}
Внесенные мной изменения в полной мере используют современный сервис Angular, использующий функциональность подписки Rxjs IMO. За последний год я разделил время между
A) использование хранилищ с Flux / Redux / Mobx для передачи разрешенных данных по приложению. Дождитесь разрешения данных с помощью наблюдаемых или используйте методы Select для получения данных
или
B) использование шаблона pub / sub для получения обновлений от служб, когда у них есть фактические данные, которые вам нужны. Я считаю, что его проще использовать, и он пригодится для небольших приложений или для вставки директив и компонентов тут и там.
Ключ, который я думаю в вашей ситуации, - это обрабатывать, где есть данные, а также когда их нет. Хорошим примером этого является то, что «... загрузка» текста, что Angular предварительно заполняет представление каждого компонента, который вы создаете с помощью Angular CLI.
Просто помните, если вы собираетесь использовать наблюдаемые для очистки их с помощью ngOnDestroy (или может произойти непреднамеренное поведение)
Удачи !!