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

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

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

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

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

谢谢。

【问题讨论】:

    标签: rest angular angular2-directives angular2-services


    【解决方案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 运算符,即使您稍后订阅,也可以让您接收事件。看到这个问题:stackoverflow.com/questions/34947642/…。老实说,我从不使用它;-) 我想您可以在订阅时调用它...
      • EventEmitter 遵循这一点,因为它是一个热门的可观察对象(通过Subject)......我的意思是你在评论中描述的机制。
      猜你喜欢
      • 2018-02-28
      • 2017-07-24
      • 2017-03-30
      • 2017-04-15
      • 2016-06-04
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      相关资源
      最近更新 更多