2016-12-22 2 views
1

Ich werde eine ID mit einem Rohr auflösen.ID in Rohr mit einem Service auflösen

Ich denke, es ist nicht der beste Weg, um den Service/api jedes Mal anrufen?

Ist es besser, alle Länder vorher zu speichern? Wie kann ich den Ländernamen innerhalb der Pipe zurückgeben?

Service:

getCountry(id:number) { 
    return this._http.get(this.apiUrl + "/country/" + id).map(res => res.json()); 
} 

Rohr:

export class ResolvePipe implements PipeTransform { 
    constructor(public _formDataService: FormDataService) {} 
    transform(value: number, args: any[]): any { 
    this._formDataService.getCountry(value).subscribe(
     data => console.log(data[0].name) 
    ) 
    } 
} 

EDIT:

<tr (click)="showProfile(customer)" *ngFor="let customer of (customers | search:term)"> 
    <td>...</td><td>{{customer.country_id | resolve | async}}</td> 
</tr> 

Antwort

1

Zuerst müssen Sie eine Observable zurückzukehren. Wenn Sie subscribe() anrufen, wird ein Subscription zurückgegeben. Auch müssen Sie tatsächlich etwas von transform() zurückzukehren daher der return

export class ResolvePipe implements PipeTransform { 
    constructor(public _formDataService: FormDataService) {} 
    transform(value: number, args: any[]): any { 
    // added `return` and changed `subscribe` to `map` 
    return this._formDataService.getCountry(value).map(
     data => { 
     console.log(data[0].name); 
     return data; // with `{ }` explicit `return` is required 
     }); 
    ) 
    } 
} 

dann kannst du das Rohr wie

<div>{{someId | myIdPipe | async}}</div> 

oder

verwenden können
<some-comp [idProp]="someId | myIdPipe | async></some-comp> 

Die async Rohr abonnierten zum Observable zurück von transform und verwendet den resultierenden Wert für die Bindung.

+0

danke, funktioniert, aber es ist sehr langsam. Was kann ich tun, um die Leistung zu beschleunigen? – robert

+1

Schwer von hier zu sagen, was langsam ist. Läuft die Antwort vom Server so lange? Wird das Pipe so oft ausgeführt, dass es Ihre Anwendung verlangsamt? Ich kann es von hier nicht sagen. Sie können einen Cache innerhalb von 'FormDataService' verwalten, wie in http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an-angular-2- http-network-call-in –

+0

Ja, es heißt 1000 mal. Ein Cache sollte dieses Problem lösen. – robert