2017-05-12 3 views
0

Ich habe Komponente details.ts, wo ich diese Methode haben:Wie gibt man einen Wert aus einer Methode in einer anderen Komponente zurück?

getCantonsByCode(cantonCode: string) {  
    this.restService.getSelectedByCode("rcanton", cantonCode) 
    .subscribe(results => { 
     return this.canton = results["payload"]; 
    }); 
} 

In Komponente address.ts möchte ich so etwas wie dies zu tun:

this.addressDetailForm.addressDetails.viewAttr2 = this.addressDetailForm.getCantonsByCode(address.cantonCode) 

Aber im immer undefiniert. Irgendein Vorschlag wie kann ich diesen Wert zurückgeben?

Antwort

0

Das erste, was Sie tun sollten, ist Ihr Code wie folgt zu ändern:

getCantonsByCode(cantonCode: string) {  
    this.restService.getSelectedByCode("rcanton", cantonCode) 
     .subscribe(results => { 
     this.canton = results["payload"]; 
     return this.canton; 
    }); 
} 

Wenn dies jedoch nicht Ihr Problem beheben, sollten Sie sicherstellen, wenn results wirklich ist, was Sie erwarten.

bearbeiten

ich mit der anderen Antwort einverstanden, dass Sie die Daten nicht über Attribut des Dienstes zugreifen sollte, so werde ich meine Antwort verfeinern. Sie sollten Folgendes tun:

getCantonsByCode(cantonCode: string) {  
    this.restService.getSelectedByCode("rcanton", cantonCode) 
     .map(results => results["payload"]); 
} 

und abonnieren Sie das Observable in Ihrer Komponente.

+0

wenn ich console.log this.canton in getCantonsByCode mache, bekomme ich Daten, aber in anderen Komponenten, wenn ich console.log mache ich undefined – None

+0

ich ordne bereits Ergebnisse in getSeletedByCode Methode – None

0

Wenn address.ts ein Elternteil von details.ts ist, können Sie @ViewChild verwenden.

Zeigen Sie Ihre getCantonsByCode als public Methode an.

In Ihrem address.html

<details #details></details>

Und address.ts

@ViewChild('details') details : DetailsComponent 
details.getCantonsByCode(address) 

Edit: Ich mißverstanden

Der Grund, warum Sie nicht definiert werden immer ist, weil Ihre Methode einen asynchronen Anruf tätigt .

Diese Zeile gibt nichts zurück.

this.addressDetailForm.addressDetails.viewAttr2 = this.addressDetailForm.getCantonsByCode(address.cantonCode) 

Sie müssen Ihre Methode zu den folgenden ändern.

getCantonsByCode(cantonCode: string) : Observable<any>{  
    return this.restService.getSelectedByCode("rcanton", cantonCode) 

} 

Und abonnieren Sie diese Methode, wo immer Sie den Wert ziehen möchten.

getCantonsByCode(address.cantonCode).subscribe(results => { 
     return this.canton = results["payload"]; 
    }); 
+0

Ok was ist, wenn ich meine Funktion in Adresse verschiebe.ts und ich brauche nicht ViewChild, ich bekomme wieder undefined, wenn ich console.log (this.getCantonsByCode (address.cantonCode)) – None

+0

Sorry, ich missverstanden Ihre Frage, erkennen Sie den Grund, warum Sie undefined ist, weil Ihre Methode nicht synchron zurückkehrt ? Sie haben keine Rückkehr außerhalb des Abonnements –

+0

Wenn ich es in subscribe setzen ich auch nicht definiert, aber in console.log innerhalb subscribe ich Daten – None

1

Adresskomponente sollte direkt über den Dienst auf Daten zugreifen, genau wie die Detailkomponente. Im Allgemeinen sollten Komponenten einander nicht bewusst sein, insbesondere nicht für den Zugriff auf Daten. Es macht keinen Sinn, auf Daten (Serviceschicht) durch andere Komponenten (UI-Layer) zuzugreifen.

Verwandte Themen