3

我想知道是否可以按操作过滤 store.select 订阅(就像我们在效果中所做的那样)。请看下面的代码:

this.store
  .select(mySelector)
  .subscribe(obj => { . //FILTER SUBSCRIPTION BY ACTION 
    this.object = obj; 
  });

每次调度一个动作(无论哪个动作)时,每个具有 store.select.subscribe 的活动组件(未销毁且未取消订阅)都会被调用。

如果我们的应用程序有 100 个动作,则每次触发 1 个动作时,都会调用所有活动组件(未销毁或取消订阅)store.select.subscribe。(如果影响组件的状态没有改变,我知道我们不会有任何问题,因为状态仍然相同)。

我为什么要问这个问题?

有时,每当影响组件的状态发生变化时,我都需要在组件中执行一些操作。所以,每次我需要做一个 if 语句来检查对象是否已经改变。如果我有操作过滤器,则不再需要此 if 语句,因为我过滤了影响我的组件的特定操作的订阅。请参阅下面显示此 if 语句的代码:

myObject: any; //global object of my component


  constructor(
    private store: Store<AppState>,
  ) {
    this.store
      .select(mySelector)
      .subscribe(obj => {
        if(obj.id !== myObject.id) //changed{
          this.myObject = obj;
          doSomeActionInMyComponent()
        } else {
          this.myObject = obj;
        }
      });
  }

  doSomeActionInMyComponent() {
      //do some action using this.myObject
  }

我的想法是有道理的,还是我误解了ngrx的概念?我应该为此使用其他类似效果的东西吗?

提前致谢。

4

2 回答 2

1

这是不可能的,选择器会对状态变化做出反应。

我确实觉得有点奇怪,当你调度一个动作时,每个选择器都会发出一个新的结果。只有受状态更改影响的选择器应该发出新结果,这是因为在内部选择器正在缓存输入,如果输入没有更改,它将不会执行。

文档

当使用 createSelector 和 createFeatureSelector 函数时,@ngrx/store 会跟踪调用选择器函数的最新参数。因为选择器是纯函数,所以当参数匹配时可以返回最后一个结果,而无需重新调用选择器函数。这可以提供性能优势,特别是对于执行昂贵计算的选择器。这种做法称为记忆。

如果你有复制品,我很乐意看看。

于 2019-03-28T07:16:30.393 回答
0

您可以改为订阅 Action,但这无论如何都不是一个好习惯。

constructor(action$: Actions) {
        action$.pipe(
           ofType(YourAction.ANY_ACTION),
           takeUntil(this.destroyed$)
        )
        .subscribe(() => {
          ...
        });
}
于 2021-12-05T00:08:16.317 回答