Angular NGXS-良好实践:在操作中传递服务所需的参数,还是从状态获取?

Angular NGXS-良好实践:在操作中传递服务所需的参数,还是从状态获取?,angular,redux,ngxs,Angular,Redux,Ngxs,在处理已调度的操作时,状态需要一些参数传递给服务,例如资源的ID,以便执行该操作。 我该如何得到这些参数 1.国家: @Action(AddCartItem) addCartItem({getState,patchState}:StateContext,{item}:addCartItem){ const cartId=getState().cartId; 返回此.service.addCartItem(cartId,item).pipe( 点击(项=>patchState({/*[…]*/})

在处理已调度的操作时,状态需要一些参数传递给服务,例如资源的ID,以便执行该操作。 我该如何得到这些参数

1.国家:
@Action(AddCartItem)
addCartItem({getState,patchState}:StateContext,{item}:addCartItem){
const cartId=getState().cartId;
返回此.service.addCartItem(cartId,item).pipe(
点击(项=>patchState({/*[…]*/})),
);
}
优点:

  • 调度组件中的这些参数不需要选择器
  • 减少耦合(即,如果其中一个参数发生变化,则无需更换部件)
缺点:

  • 行动的可见性较低(即缺少信息)

2.从行动中:
@Action(AddCartItem)
addCartItem({getState,patchState}:StateContext,{cartId,item}:addCartItem{
返回此.service.addCartItem(cartId,item).pipe(
点击(项=>patchState({/*[…]*/})),
);
}
优点:

  • 纯洁的
  • 提高行动的可视性
缺点:

  • 在分派组件中需要选择器
  • 更多耦合


在我看来,选项2看起来更好,但我遗漏了什么吗?选项2会导致不必要的副作用吗?

我认为答案与用户故事密切相关,但我个人在我的应用程序中有两种模式……当状态只包含一个可能的操作值时,不通过它是有意义的,但是,当服务ram有n+1个可能值我在操作中传递它

我认为答案与用户故事密切相关,但我个人在我的应用程序中有两种模式……当状态只包含一个可能值时,不传递它是有意义的,但是,当服务参数有n+1个可能值我在操作中传递它

不要t将操作耦合到当前状态,因为您可能无法使用Redux调试器重播操作、跳过操作或回滚操作

如果您的动作是从前一个状态更改状态的增量运动,并且不直接依赖于前一个状态,则效果更好


这也使得测试更加困难,因为现在单元测试需要了解更多关于预先存在的状态的信息来测试操作。如果操作在有效负载中包含更多信息,那么测试条件就更容易设置。

不要将操作与当前状态耦合,因为您可能无法重播操作,请跳过操作使用Redux调试器执行复制或回滚操作

如果您的动作是从前一个状态更改状态的增量运动,并且不直接依赖于前一个状态,则效果更好


这也使得测试更加困难,因为现在单元测试需要更多地了解预先存在的状态来测试动作。如果动作在有效负载中包含更多信息,那么测试条件就更容易设置。

关于这个主题没有最佳实践,只有权衡。每个人都有自己的主观意见。就个人而言,我不认为第二个选项比第一个选项有任何好处,因为你只是从州政府那里得到了
cartId
。我想你应该关注其他事情,而不是这个;)关于这个话题没有最佳实践,只有权衡。每个人都有自己的主观意见。就个人而言,我看不出第二个选项比第一个选项有什么好处,因为你只是从州政府那里得到了
cartId
。我想你应该关注其他事情,而不是这件事;)
  @Action(AddCartItem)
  addCartItem({ getState, patchState }: StateContext<CartStateModel>, { item }: AddCartItem) {
    const cartId = getState().cartId;
    return this.service.addCartItem(cartId, item).pipe(
      tap(item => patchState({ /* [...] */ })),
    );
  }
  @Action(AddCartItem)
  addCartItem({ getState, patchState }: StateContext<CartStateModel>, { cartId, item }: AddCartItem {
    return this.service.addCartItem(cartId, item).pipe(
      tap(item => patchState({ /* [...] */ })),
    );
  }