2017-11-15 4 views
1

Ich habe ein Problem, bei dem eine meiner beobachtbaren Variablen von einer anderen beobachtbaren abhängt, aber wenn die übergeordnete Observable aktualisiert wird, scheint das Kind nicht aktualisiert zu werden.Observables mit anderen beobachtbaren

ClientService (Eltern)

@Injectable() 
export class ClientService { 

    private client = new BehaviorSubject(""); 
    clientStream$ = this.client.asObservable(); 

    } 
} 

CommentService (Kind)

@Injectable() 
export class CommentsProvider { 
    private client$: Observable<any>; 
    private comments = new BehaviorSubject([]); 
    comments$: Observable<any[]> 

    constructor(private clientService: ClientService) { 
    this.initializeComments() 
    } 

    initializeComments() { 
    this.client$ = this.clientService.clientStream$ 
    this.comments$ = this.comments.asObservable() 

    this.client$.subscribe(client => { 
     for (let comment of client.comments) { 
     this.addComment(comment) 
     } 
    }) 
    } 

    addComment(comment) { 
    let commentArray = _.cloneDeep(this.comments.getValue()); 
    commentArray.push(comment) 
    this.comments.next(commentArray) 
    } 

    getComments() : Observable<any[]> { 
    return this.comments$ 
    } 
} 

Und meiner Meinung nach Komponente Ich nenne:

`this.comments$ = this.commentService.getComments();` 

und die Ergebnisse anzeigen mit :

*ngIf="this.comments$ | async as comments ..." 

Wenn ich einen Anruf zu addComment() machen, wird das Feld aktualisiert, jedoch, wenn ich einen Kommentar zu client.comments hinzufügen, ist das Array nicht aktualisiert. Wäre es möglich, Abonnenten über den Wechsel auf zu informieren?

+0

Wie werden Ihre Dienste zur Verfügung gestellt? Sind beide Singleton-Dienste (App-weit)? – LLai

+0

ja, das sind sie. Sollten sie etwas anderes sein? –

+2

na, Singletons sollte gut sein. Können Sie Ihren Code zu ClientService hinzufügen, wenn 'wenn ich einen Kommentar zu client.comments hinzufüge, das Array nicht aktualisiert wird' – LLai

Antwort

0

Ich vermisse etwas, aber es gibt nichts in ClientService, das dem BehaviorSubject hinzugefügt werden muss.

@Injectable() 
export class ClientService { 

    private client = new BehaviorSubject(""); 
    clientStream$ = this.client.asObservable(); 

    } 
} 

Variable client ist privat, so kann nicht außerhalb der Klasse zugegriffen werden.
clientStream$ ist asObservable(), so können Sie nicht .next(newVale) geben es neuen Wert (zumindest denke ich, das ist der Punkt von asObservable).
Haben Sie nur einen Teil von ClientService eingefügt? - Es gibt zwei abschließende Curleys, aber nur einen einzigen Curley.

Vielleicht diese Methode ClientService hinzufügen,

addClient(newClient) { 
    client.next(newClient); 
} 
Verwandte Themen