2017-02-09 6 views
1

У меня есть две angular2 услуги, из которых обеспечивает данныеДва angular2 службы, использующие ту же наблюдаемую

@Injectable() 
export class DataService { 

constructor(private http: Http) { } 

public getData(): Observable<Data> { 
    return this.http.get('/api/foo') 
     .map(res => new Data(res.json().data)); 
} 

и один, обеспечивающие настройки

@Injectable() 
export class SettingsService { 

constructor(private http: Http) { } 

public getSettings(): Observable<Settings> { 
    return this.http.get('/api/foo') 
     .map(res => new Settings(res.json().settings)); 
} 

Отклик/API/Foo является

{ 
    "settings": { 
     ... 
    } 
    "data": { 
     .... 
    } 
} 

Эти службы используют один и тот же вызов api для получения своего контента, а вызов на сервер производится дважды для того же данные.

Я понимаю, что существующий api не идеален в объединении данных и настроек в одном сообщении и может быть в конечном итоге необходимо заменить.

Тем временем мой вопрос: используя существующий api, есть простой способ предоставить службу данных и службу настроек, которые используют один и тот же вызов api? Может ли быть один вызов api, передающий данные обеим службам, или каждая служба будет работать независимо?

UPDATE: Мои мысли так далеко, что мне нужно, чтобы создать базовую услугу, которая делает фактический HTTP вызов называем это FooService. Затем FooService необходимо вводить как в SettingsService, так и в DataService, которые затем могут представлять результаты FooService в качестве параметров и данных соответственно. Где я застрял, как разблокировать Observable<any>, возвращенный FooService, в два других Observables, Observeable<Data> в Dataservice и Observeable<Settings> в SettingsService? Возможно ли это?

ответ

0

Похоже, вы хотите, чтобы вы могли динамически выбирать из объекта по ключу. Это то, что вы ищите?

public getSettings(dataKey): Observable<Settings> { 
    return this.http.get('/api/foo') 
     .map(res => new Settings(res.json()[dataKey]); 
} 
+0

@ 'Simon H '- код работает нормально на данный момент, в ответе есть как свойство настройки, так и свойство данных, и нет необходимости в динамическом selec Тион. Мой вопрос заключается в том, как реорганизовать проект так, чтобы был сделан только один HTTP-вызов для получения данных, но две службы предоставляются с использованием этих данных. –

0

Я понял, как это сделать. Создайте одну службу для доступа к api, а затем создайте службы настроек и данных, используя .map() в службе api.

Сначала нужно создать службу, доступ к основной API:

@Injectable() 
export class ApiService { 

    constructor(private http: Http) { } 

    public getObservable(): Observable<any> { 
     return this.http.get('/api/foo') 
      .map(res => res.json())); 
} 

Затем создать две службы, что программа будет потреблять:

@Injectable() 
export class SettingsService { 

    constructor(private api: ApiService) { } 

    public getSettings(): Observable<Settings> { 
     return this.api.getObservable() 
      .map(res => new Settings(res.settings)); 
    } 
} 

и

@Injectable() 
export class DataService { 

    constructor(private api: ApiService) { } 

    public getData(): Observable<Data> { 
     return this.api.getObservable() 
      .map(res => new Data(res.data)); 
    } 
}