2016-12-22 4 views
1

Я разрешу ID с трубой.Идентифицировать идентификатор в трубе с услугой

Я думаю, что это не лучший способ вызвать службу/api каждый раз?

Лучше ли хранить все страны раньше? Как я могу вернуть название страны внутри трубы?

обслуживание:

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

трубы:

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> 

ответ

1

Прежде всего, необходимо вернуть Observable. Когда вы позвоните subscribe(), будет возвращен Subscription. Кроме того, необходимо, чтобы на самом деле вернуть что-то из transform() поэтому добавил 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 
     }); 
    ) 
    } 
} 

, то вы можете использовать трубу как

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

или

<some-comp [idProp]="someId | myIdPipe | async></some-comp> 

The async труба присоединяется к Observable возвращенного от transform и использует полученное значение для привязки.

+0

спасибо, работает, но это очень медленно. Что я могу сделать, чтобы ускорить работу? – robert

+1

Трудно сказать отсюда, что медленно. Отвечает ли сервер с сервера на такое долгое время? Труба выполняется так часто, что она замедляет ваше приложение. Я не могу сказать отсюда. Вы можете хранить кеш в 'FormDataService', как описано в http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an-angular-2- http-network-call-in –

+0

Да, это называется около 1000 раз. Кэш должен решить эту проблему. – robert

Смежные вопросы