ngrx订阅服务还是从组件传递数据?

时间:2018-09-27 11:16:31

标签: angular typescript redux ngrx

我需要建议,我需要服务中存储的数据(我的服务使用Angulartics将数据发送到Google Analytics(分析)。我将所有需要的数据作为对象存储在存储中,这更好:

  1. 订阅要存储在我的服务中,该服务每次都会将数据发送到分析。
  2. 将存储注入到每个组件,获取数据-发送给服务,然后退订吗?

此外,我会在获取服务信息时调度操作。我如何创建商店字段侦听器? (在此字段未定义时获取数据)

3 个答案:

答案 0 :(得分:2)

对我来说,这是使用@ngrx/effects的好时机。如果您已经在使用@effects,那么利用它应该不会太困难。如果不是这样,您可能必须采用的一般模式是将将数据(即副作用,如异步服务调用)加载到效果文件的Service调用。然后,您可以执行类似的操作来跟踪分析事件。它具有上面提到的好处,可以在一个地方进行跟踪。

@Effect({ dispatch: false })
trackEvents = this.actions.pipe(
  ofType(...),
  tap(({ type, payload }) => {
    // make call to Angulartics
    this.angulartics2.eventTrack.next({ 
      action: type, 
      properties: { ...payload },
    });
  })
)

已剪切的代码是从https://blog.angularindepth.com/start-using-ngrx-effects-for-this-e0b2bd9da165#8a65复制的。

答案 1 :(得分:0)

第一种方法很有意义,它将逻辑放在一个地方。您需要做的是订阅服务中的商店更改,然后将其发送到分析服务:

您可以将Store服务注入到您的服务中。使用store.select选择状态片:

在服务的构造函数中,您可以像这样订阅对象中的更改:

this.store.select('keyName').subscribe( (data)=> {
 // do whatever you want with this data
});

答案 2 :(得分:0)

我阅读了这篇文章https://brianflove.com/2017/11/01/ngrx-anti-patterns/,并设法不明确地订阅组件或服务,也不使用任何效果。 第一步是使服务方法侦听过滤器更改,通过管道将数据传递到http请求,然后使用该数据调度事件并返回可观察到的结果

StatusBarNotification

第二步是将结果传递给组件中的可观察对象:

StatusBarNotification