ngrx store select仅订阅特定操作

时间:2019-03-27 23:48:59

标签: angular ngrx redux-store

我想知道是否可以通过操作过滤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概念?我应该为此使用其他效果吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

我确实感到有些奇怪,当您调度动作tho时,每个选择器都会发出新结果。只有受状态更改影响的选择器才应发出新结果,这是因为在内部选择器会缓存输入,如果输入未更改,它将不会执行。

来自docs

  

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

如果您有复制品,我很乐意看一下。