2016-02-11 3 views
2

Я часть приложения Angular2 (мы используем beta3), и вопрос заключается в следующем:Angular2 несколько компонентов, используя один REST вызов

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

Однако у нас есть страница с более чем 6 компонентами, все из которых используют один и тот же вызов REST ... (бэкэнд возвращает данные для ВСЕХ из них), и нет смысла вызывать 6 раз REST для каждый компонент, также будет странно, если мы сделаем кеширование на стороне клиента.

Есть ли что-то доступное из коробки? Или шаблон для обработки такого случая?

Спасибо.

ответ

4

Просто сделайте это в общем сервисе. Если вы добавите его только в bootstrap(..., [OtherProviders, HTTP_PROVIDERS, MyService]), каждый компонент получит тот же экземпляр. Хранить данные в службе, и каждый компонент может получить к нему доступ

export class MyComponent { 
    constructor(private dataService:MyService) { 
    dataService.getData().subscribe(data => { this.data = data; }); 
    } 
} 
export class MyService { 
    getData() { 
    if(!this.data) { 
     return http.get(...).map(...).subscribe(data => { this.data = data;}); 
    } 
    return this.data; 
    } 
} 
+0

Интересно :) Большое спасибо. – JOKe

1

The @ ответ Гюнтер действительно имеет смысл!

Я не знаю, что ваш код организован, но наблюдаемый также может быть подписан несколько раз. Для этого вам нужно, чтобы сделать их «горячей» с помощью оператора share:

export class MyService { 
    dataObservable:Observable; 

    initDataObservable() { 
    this.dataObservable = http.get(...).map(...).share(); 
    } 
} 

без использования оператора share, соответствующий запрос будет выполняться несколько раз (один за подписку).

Вы можете заметить, что запрос будет выполнен после вызова метода subscribe наблюдаемого.

+1

Интересно. Как я это понимаю, только события, которые приходят ** после ** подписки, будут отправлены подписчику. Если запрос, инициированный первым абонентом, уже прибыл, когда подписались следующие подписчики, они просто ждут, когда события не прибудут. Я думаю, что этот «share» имеет смысл только для таких событий, как «mousemove», где вам все равно, что произошло до того, как вы подписались. Как вы думаете? –

+1

Да, согласен! Только абоненты, зарегистрированные при возникновении события, будут уведомлены с помощью оператора 'share'. Тем не менее, я знаю, что существует оператор 'publishReplay', который позволяет вам получать событие, даже если вы подписались позже. См. Этот вопрос: http://stackoverflow.com/questions/34947642/angular2-observables-replay. Честно говоря, я никогда не использую его ;-) Я предполагаю, что вы могли бы назвать это при подписке ... –

+1

'EventEmitter' следует за этим, так как это горячее наблюдаемое (через' Subject') ... Я имею в виду механизм, который вы описали в своем комментарии. –