2017-02-18 5 views
3

Ich habe 2 Geschwisterkomponenten zur gleichen Zeit für den Benutzer angezeigt. Einer von ihnen ist eine QuestionList, die eine Reihe von Fragen aus dem Service und eine Liste von Fragen anzeigt. Sobald Sie sich auf eine bestimmte Frage klicken zeigt es (neben der Liste) Frage Details unten enter image description hereAngular 2 Geschwisterkomponenten 2-Wege-Bindung

Frage Detail Komponente gesehen mag verwendet Router Frage-ID aus der URL zu nehmen und speichert sie in einer separaten Variable namens selectedQuestion wie folgt aus:

selectedQuestion: Question; 
ngOnInit() { 
    this.subscription = this.route.params.subscribe(
     (params: any) => { 
     this.questionIndex = params['questionId']; 
     this.selectedQuestion = this.qs.getQuestion(this.questionIndex); 
     } 
    ); 
    } 

In der Vorlage selectedQuestion wird mit binded [(ngModel)] -> 2-Wege-Datenbindung, so kann ich einfach durch das Senden selectedQuestion an den Dienst, die Frage aktualisieren.

Ich habe Schwierigkeiten zu verstehen, warum und wie Angular2 die Liste aktualisiert, wenn ich etwas in der Frage Detailansicht ändere? Ich dachte, Ursache habe ich separate Variable namens selectedQuestion erstellt, Liste auf der linken Seite sollte nicht aktualisiert werden, bis ich Änderungen an die Verwendung des Dienstes drücken? Mein Verständnis der Verwendung von ngModel ist, dass es 2-Wege-Bindung nur an selectedQuestion und definitiv nicht zu aktualisieren mein Service

+1

Kasse meine Antwort unter – Aravind

Antwort

1

Sie sich beziehen auf gleiche Instanzen der ausgewählten Frage, und Sie müssen wie unten

Import der lodash ändern, wenn Sie nicht mit installieren

npm install --save lodash 

import * as _ from "lodash"; 


selectedQuestion: Question; 
ngOnInit() { 
    this.subscription = this.route.params.subscribe(
     (params: any) => { 
     this.questionIndex = params['questionId']; 
     this.selectedQuestion = _.clone(this.qs.getQuestion(this.questionIndex)); 
     } 
    ); 
    } 

Alternativ

selectedQuestion: Question; 
ngOnInit() { 
    this.subscription = this.route.params.subscribe(
     (params: any) => { 
     this.questionIndex = params['questionId']; 
     let jsonQuestionasString JSON.stringify(this.qs.getQuestion(this.questionIndex); 
     this.selectedQuestion = JSON.parse(jsonQuestionasString); 
     }); 
    } 

Es gibt mehrere Alternativen dazu. Einige davon ist oben gezeigt

+0

Danke für Ihre Antwort. Während ich sicher bin, dass Ihre Lösung funktioniert (wirklich zu schätzen), bin ich mir immer noch nicht sicher, warum es dieselbe Instanz ist, da es scheint, dass ich sie in separaten Klassen einer neuen Instanz zuordne Service und wird nur von diesen 2 Klassen zugegriffen und an neue Variablen übergeben, würde man erwarten, dass es eine separate Kopie wäre? –

+1

In Javascript, obwohl es zwei separate Objekte gibt, zeigen beide auf die gleiche Instanz (gleiche Speicherreferenz). Um die Referenzen zu trennen, sollten Sie also eine der oben genannten Optionen verwenden. – Aravind

+0

Vielen Dank, dann muss ich mehr in die Speicherverwaltung schauen! –

1

Es sieht aus wie Sie die gleiche Instanz der Frage zwischen zwei Komponenten teilen, während Änderungserkennung erkennen beide Komponenten Änderungen und sie beide werde aktualisiert.