Angular2 使用一个 REST 调用的多个组件

Posted

技术标签:

【中文标题】Angular2 使用一个 REST 调用的多个组件【英文标题】:Angular2 multiple components using one REST call 【发布时间】:2016-05-21 21:31:23 【问题描述】:

我是 Angular2 应用程序的一部分(我们使用 beta3),问题如下:

通常我们有一个使用一些服务的组件,该服务使用一些休息调用,并且该组件显示数据。太好了。

但是,我们确实有一个页面,其中包含超过 6 个组件,所有这些组件都使用相同的 REST 调用...(后端返回所有组件的数据)并且为每个组件调用 6 次 REST 是没有意义的组件,如果我们做一些客户端缓存也会很奇怪。

是否有现成可用的东西?或者处理这种情况的模式?

谢谢。

【问题讨论】:

【参考方案1】:

只需在共享服务中进行即可。如果你只在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;
  

【讨论】:

【参考方案2】:

@Günter 的回答真的很有道理!

我不知道您的代码是否有条理,但 observable 也可以订阅多次。为此,您需要使用 share 运算符使它们“热”:

export class MyService 
  dataObservable:Observable;

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

不使用share操作符,对应的请求会执行多次(每次订阅一次)。

您可以注意到,一旦在 observable 上调用了一个 subscribe 方法,请求就会被执行。

【讨论】:

有趣。我的理解是,只有在订阅 之后到达的事件才会发送给订阅者。如果第一个订阅者发起的请求在下一个订阅者订阅时已经到达,他们将等待永远不会到达的事件。我认为这个share 只对像“mousemove”这样的事件有意义,在这些事件中你不在乎订阅前发生了什么。你怎么看? 是的,同意!只有在事件发生时注册的订阅者才会使用share 运算符得到通知。也就是说,我知道有一个 publishReplay 运算符,即使您稍后订阅,也可以让您接收事件。看到这个问题:***.com/questions/34947642/…。老实说,我从不使用它;-) 我想您可以在订阅时调用它... EventEmitter 遵循这一点,因为它是一个热门的可观察对象(通过Subject)......我的意思是你在评论中描述的机制。

以上是关于Angular2 使用一个 REST 调用的多个组件的主要内容,如果未能解决你的问题,请参考以下文章

Ionic2,Angular2:如何在使用 http get 进行 REST API 服务调用时避免 CORS 问题?

angular2 - 在组件之间传递数据对象

如何使用angular2在单个组件中调用多个模板

Angular2 Observable - 在继续之前等待多个函数调用

我无法在 Angular 中获得 REST 服务响应

使用 Angular2 将文件上传到 REST API