Eckige 4 - rxjs BehaviorSubject Nutzung in Service

Mein Service code sieht wie folgt aus -

DataService

@Injectable()
export class DataService {
...
private serviceRequestDtoSource = new BehaviorSubject<ServiceRequestDto>(null);
serviceRequestDto$ = this.serviceRequestDtoSource.asObservable();
...
getAccountInfo(serviceRequestDto : ServiceRequestDto){
    let body = JSON.stringify(serviceRequestDto);
    let headers = new Headers({
        'Content-Type': 'application/json'
    });
    let options = new RequestOptions({ headers: headers });
    console.log("In data service.getAccountInfo");
    this.http
        .post(this.clientAccountInfoURL, body, options)
        .map((response : Response) => { return <AccountDto[]> response.json().accountDtoList})
        .do(data=> console.log('All :'+ JSON.stringify(data)))
        .subscribe( response => { 
                             this.accountList = response; 
                             this.serviceRequestDto.accountDtoList = this.accountList;
                             this.serviceRequestDtoSource.next(serviceRequestDto);
                         },
                         error => this.errorMessage = <any>error);
}

Search-Komponente (das trifft vor service und auch abonniert) sieht wie folgt aus -

onSearch(value) {  
...
this.dataService.getAccountInfo(this.serviceRequestDto); //service call
this.subscription = this.dataService.serviceRequestDto$
        .subscribe( (serviceRequestDtoValue : ServiceRequestDto) => {
        //Control doesn't come here..
         this.serviceRequestDto = serviceRequestDtoValue;
         console.log('search.serviceRequestDto.length:'+this.serviceRequestDto.accountDtoList.length);
         console.log('search.serviceRequestDto.accountDtoList.name:'+this.serviceRequestDto.accountDtoList[0].name);
    });

Wie oben erwähnt, die Kontrolle nicht kommen hier rein, beobachten Komponente subscribe-Methode als keiner der die Protokolle gedruckt werden, und auch ich bekomme keine Fehlermeldung in der Konsole.Nicht sicher, wenn ich mit BehaviorSubject in der richtigen Art und Weise.

Versuchte ich zu Folgen folgenden links -

Eckige 2 - Verhalten Unterliegt vs Beobachten? -> ohne Sie abonnieren, wie Sie hier erwähnt.

http-observablen -> Wenn ich versuchte auf diese Weise , es tut geben Sie abonnieren, aber dann wirft Fehler für Protokolle -

nicht Lesen-Eigenschaft xyz null
als Komponente protokolliert wird gedruckt, noch bevor ich die Daten aus dem Dienst.- Service-Protokolle bekam später gedruckt, nachdem ich den oben genannten Fehler.

Meine Absicht ist nicht, zu abonnieren BehaviorSubject von SearchComponent selbst das trifft es service. Ich versuche nur zu testen, wenn ich die Werte aus dem Dienst in alle Komponente.Ich glaube, es ist so gut, wie das abonnieren von jeder anderen Komponente, die Bedürfnisse serviceRequestDto Werte als syntax für die Anmeldung bleibt gleich, die aus allen Komponenten.

Update 1:

Habe ich versucht zu verwenden ReplaySubject(1) wie vorgeschlagen von Brandon, aber trotzdem war ich immer folgende Fehlermeldung beim abonnieren Thema in der Komponente.

TypeError: Cannot read property 'name' of undefined(...)

Meine aktualisierte service code sieht jetzt wie folgt aus -

serviceRequestDtoSource = new ReplaySubject<ServiceRequestDto>(1);
getAccountInfo(serviceRequestDto : ServiceRequestDto){
 ...
 //Logic same as earlier
 //I'm getting all values from service here in the logs I print

 }

Bitte beachten Sie, früher war ich mit folgenden in service code -

private serviceRequestDtoSource = new BehaviorSubject<ServiceRequestDto>(null);
serviceRequestDto$ = this.serviceRequestDtoSource.asObservable();

Meine aktualisierte Search-Komponente code sieht wie folgt aus -

this.dataService.getAccountInfo(this.serviceRequestDto);
this.dataService.serviceRequestDtoSource.subscribe((serviceRequestDtoValue : ServiceRequestDto) => {
this.serviceRequestDto = serviceRequestDtoValue;
console.log('search.serviceRequestDto.length:'+this.serviceRequestDto.accountDtoList.length);           
//prints 'search.serviceRequestDto.length:0'
console.log('search.serviceRequestDto.accountDtoList   name:'+this.serviceRequestDto.accountDtoList[0].name); //throws 'vendor.bundle.js:5764 ERROR TypeError: Cannot read property 'name' of undefined(…)' error
});

Die Möglichkeit, frühere Komponente war der code für abonnieren Thema war anders, und die Kontrolle ging nie im inneren Komponente abonnieren, obwohl es keine Fehler.

Meine anfängliche code ist Verschieden von dem, was ich gepostet habe und es jetzt wurde basierend auf den folgenden link - delegation-eventemitter-oder beobachtbar-in-angular2

InformationsquelleAutor coder87 | 2017-06-15
Schreibe einen Kommentar