2016-12-08 16 views
0

Nicht sicher, ob ich die Frage richtig stelle, aber ich habe einen Dienst, der verwendet wird, um ein Array-Objekt zwischen verschiedenen Komponenten zu teilen. Wenn ich jedoch das neue Objekt an den Dienst übergebe, aktualisiert etwas alle anderen Objekte in meinem Dienstarray.Angular2 Observable Aktualisieren private Variable

dh ersten Schub Antworten = [{QuestionID: 1, Wert: 1}] zweiten Push mit {QuestionID: 1, Wert: 3} Antworten = [{QuestionID: 1, Wert: 3}, { questionId: 1, value: 3}]

Beachten Sie, wie der Wert geändert wird, um dem Wert des neu gedrückten Antwortobjekts zu entsprechen.

Das ist mein Service

export interface Answer { 
    questionId: number; 
    value: number; 
} 

    private answers: Answer[] = []; 
    private _answers: BehaviorSubject<Answer[]> = new BehaviorSubject([]); 
    public answers$ = this._answers.asObservable(); 


    addAnswer(answer: Answer) { 
    this.answers.push(answer); 
    this._answers.next(this.answers); 
    } 

Diese meine Komponente

export class LevelComponent { 
    subscription: Subscription; 
    answer: Answer = {questionId: 0, value: 0}; 
    a: Answer[]; 
    constructor(public route: ActivatedRoute, public answerService: AnswerService) { 

    } 

    ngOnInit() { 

    this.subscription = this.answerService.answers$.subscribe(item => this.a = item); 


    } 
    ngOnDestroy() { 
    // prevent memory leak when component is destroyed 
    this.subscription.unsubscribe(); 
    } 


    submitAnswer(e){ 
    console.log(e.target.id); 
    this.answer.questionId = 1; 
    this.answer.value = e.target.id; 

    this.answerService.addAnswer(this.answer); 
    } 

Grundsätzlich ist ich bin auf der Suche zu ‚teilen‘ eine Reihe von Antworten auf mehrere Komponenten, aber begrenztes Verständnis von BehaviorSubject und Abonnements ist verblüfft, warum nach dem Hinzufügen eines neuen Elements zu dem im Dienst befindlichen Array alle anderen Objekte aktualisiert werden. Nebenbei bemerkt: Wenn ich die Antwortvariable so ändere, dass sie nur eine Zahl ist, ändern sich die Werte im Array nicht, wenn ich die Antwort einreiche.

Hier ist eine Plunker, die veranschaulicht, was ich sehe.

+0

Was meinst du * "alle anderen Objekte aktualisieren" *? Könntest du ein [mcve] geben? – jonrsharpe

+0

aktualisiert mit einem Beispiel, wie das Antwortobjekt aktualisiert wird – utd1878

+0

@jonrsharpe hinzugefügt einen Plunder – utd1878

Antwort

0

Danke für diejenigen, die meine Frage anschauten.

So stellt sich heraus, dass mein Service korrekt war und wie erwartet funktioniert. Das Problem war, dass ich jedes Mal die gleiche Referenz meiner Antwort an den addAnswer-Aufruf weitergab, sodass die referenzierte Antwort aktualisiert wurde, die wiederum jedes Objekt im Array aktualisierte.

Die Lösung bestand darin, vor dem Senden jedes Mal eine neue Antwort zu geben.

submitAnswer(e){ 
    let answer: Answer = {questionId: 1, value: e.target.id}; 
    this.answerService.addAnswer(answer); 
    } 
0

Wahrscheinlich, weil Ihr dies zu tun:

this.answers.push(answer); 
this._answers.next(this.answers); 

, wenn Sie nur diese

this._answers.next(answer); 

IE tun müssen, als nächstes mit dem gesamten Array Durch den Aufruf, Ihre Abonnenten wird das gesamte Array als nächstes empfangen Element und nicht nur das nächste Element.

+0

_answers ist ein BehaviorSubject . Antwort ist nur ein einzelnes Antwortobjekt. Wie würde ich die neue Antwort in die _answers var schieben? – utd1878