Несколько компонентов Angular2 с использованием одного вызова REST

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

Обычно у нас есть компонент, который использует какую-то службу, которая использует вызов rest, и компонент отображает данные. Большой.

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

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

Спасибо.


person JOKe    schedule 11.02.2016    source источник


Ответы (2)


Просто сделайте это в общем сервисе. Если вы добавите его только в 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;
  }
}
person Günter Zöchbauer    schedule 11.02.2016

Ответ @Günter действительно имеет смысл!

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

export class MyService {
  dataObservable:Observable;

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

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

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

person Thierry Templier    schedule 11.02.2016
comment
Интересно. Насколько я понимаю, подписчику будут отправляться только те события, которые приходят после подписки. Если запрос, инициированный первым подписчиком, уже поступил, когда подписываются следующие подписчики, они просто будут ждать, пока события никогда не поступят. Я думаю, что это share имеет смысл только для таких событий, как mousemove, когда вам все равно, что произошло до подписки. Что вы думаете? - person Günter Zöchbauer; 11.02.2016
comment
Да, согласен! Только подписчики, зарегистрированные при возникновении события, будут уведомлены с помощью оператора share. Тем не менее, я знаю, что есть оператор publishReplay, который позволяет вам получать событие, даже если вы подпишетесь позже. См. этот вопрос: stackoverflow.com/questions/34947642/. Честно говоря, я никогда не использую его ;-) Я думаю, что вы могли бы назвать это при подписке... - person Thierry Templier; 11.02.2016
comment
EventEmitter следует за этим, так как это горячая наблюдаемая (через Subject)... Я имею в виду механизм, который вы описали в своем комментарии. - person Thierry Templier; 11.02.2016