Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular ngrx在服务中订阅还是从组件传递数据?_Angular_Typescript_Redux_Ngrx - Fatal编程技术网

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

Angular ngrx在服务中订阅还是从组件传递数据?,angular,typescript,redux,ngrx,Angular,Typescript,Redux,Ngrx,我需要建议,我需要存储在服务中的数据我的服务使用Angulartics将数据发送到Google Analytics。我将所有需要的数据作为对象存储在存储中,更好的方法是: 订阅我的服务中的store,它每次都将数据发送到analytics。 将存储注入每个组件,获取数据-发送到服务,然后取消订阅? 此外,我还可以在获取服务中的信息时发送操作。如何创建存储字段侦听器?当此字段未定义时获取数据第一种方法有意义,它将保持逻辑在一个位置。您需要做的是订阅服务中的商店更改,然后将其发送到analytics

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

订阅我的服务中的store,它每次都将数据发送到analytics。 将存储注入每个组件,获取数据-发送到服务,然后取消订阅?
此外,我还可以在获取服务中的信息时发送操作。如何创建存储字段侦听器?当此字段未定义时获取数据第一种方法有意义,它将保持逻辑在一个位置。您需要做的是订阅服务中的商店更改,然后将其发送到analytics service:

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

在服务的构造函数中,您可以订阅对象中的更改,如下所示:

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

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

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

在服务的构造函数中,您可以订阅对象中的更改,如下所示:

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

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

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

截取的代码是从中复制的。

对我来说,这是一个很好的使用时机。如果您已经在使用@effects,那么利用它应该不会太困难。如果没有,您可能必须采用的一般模式是将加载数据的服务调用(如异步服务调用)移动到效果文件中。然后,您可以这样做来跟踪分析事件。它有上面提到的在一个地方跟踪的好处

@Effect({ dispatch: false })
trackEvents = this.actions.pipe(
  ofType(...),
  tap(({ type, payload }) => {
    // make call to Angulartics
    this.angulartics2.eventTrack.next({ 
      action: type, 
      properties: { ...payload },
    });
  })
)
截取的代码是从中复制的。

我读了这篇文章,设法不在组件或服务中明确订阅,也不使用任何效果。 第一步是使服务方法监听过滤器的更改,通过管道将数据传递给http请求,然后使用此数据调度事件并返回可观察的结果

getCarItems(): Observable<ICarItem[]> {
 return  this.store.select(state => state.filter).pipe(
           map (source=> 
            {
            let productId=source.product ? source.product.productId:'';
            let brand = source.brand||'';            
            return({productId ,brand})                
            }),
        switchMap(value => this.http.get(`${this._baseUrl}api/caritems`,{params:value})),
        tap((list:ICarItem[]) => {        
          this.store.dispatch(new LoadCarItemsAction(list));}          
       ),
       switchMap(()=>this.store.select(state=>state.carItems))        
       )
}
我读了这篇文章,设法不在组件或服务中明确订阅,也不使用任何效果。 第一步是使服务方法监听过滤器的更改,通过管道将数据传递给http请求,然后使用此数据调度事件并返回可观察的结果

getCarItems(): Observable<ICarItem[]> {
 return  this.store.select(state => state.filter).pipe(
           map (source=> 
            {
            let productId=source.product ? source.product.productId:'';
            let brand = source.brand||'';            
            return({productId ,brand})                
            }),
        switchMap(value => this.http.get(`${this._baseUrl}api/caritems`,{params:value})),
        tap((list:ICarItem[]) => {        
          this.store.dispatch(new LoadCarItemsAction(list));}          
       ),
       switchMap(()=>this.store.select(state=>state.carItems))        
       )
}

这个选择对我不起作用。我应该将reducer名称转换为string吗?我相信@select语法适用于另一个类似的库,称为angular redux,这个select对我不起作用。我应该将reducer名称转换为string吗?我相信@select语法适用于另一个类似的库,称为angular redux,