当一个字段更新时,angular 7 ngrx 会触发所有字段的订阅

Ben

嗨,我使用 Ngrx 作为我的前端项目的状态管理。最近我发现更新状态中的一个字段时会触发所有订阅。

假设我有一个包含字段 A 和 B 的状态。相应地,我有 AComponent 和 BComponent 订阅了 A 和 B 的值。现在如果我继续调度一个动作来更新 A。即使 B 的订阅也将一直被触发B 的值没有更新。

目前我在做的是在B的订阅函数中,查看值是否改变了,比如

if (this.B !== B) {
    //do something
}

有没有什么办法,如果我调度一个动作来更新A,不触发B的订阅?或者这就是NGRX的基本机制?

谢谢

更新

这是我正在使用的选择器

this._store
  .select("appState")
  .pipe<T>(pluck("B"))
  .subscribe(callback);

更新 2

根据@Anarno 的回答,我添加了选择器如下

const BFeatureSelector = createFeatureSelector<string>('b');
export const BSelector = createSelector(
    BFeatureSelector,
    state => state
);

同时,我在 reducer 中打印一条消息以确保 B 更新为

case app.ActionType.B: {
    console.info("b is update in reducter");
    return Object.assign({}, state, { b: action.payload });
}

然后我在 BComponent 中使用这个 BSelector 有以下三种方法

this._store.select(BSelector).subscribe(b=> {
  console.info("b is updated 1");
  console.info(b);
});

this._store
  .pipe(
    map(state => BSelector(state))
  )
  .subscribe(b=> {
    console.info("b is updated 2");
    console.info(b);
  });

this._store
  .pipe(select(notificationSelector))
  .subscribe(b=> {
    console.info("b is updated 3");
    console.info(b);
  });

我观察到的是,b is updated 1并且b is updated 3仅在组件初始化时打印一次,而b is updated 2在状态中的其他字段更新时一直打印。但是,console.info(b);每种方法都不起作用。所有三种方法都不会打印 b 的内容。

阿纳诺

您需要一个选择器文件,并像这样制作选择器:

import { createFeatureSelector, createSelector } from '@ngrx/store';
import { BState } from '../../../reducers/index';

const selectBState = createFeatureSelector<BState>('BState');

export const selectBvalue = createSelector(
  selectBState,
  state => state.value
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Angular 7中使用反应形式设置“至少应填写一个字段”验证?

Angular 7,Ngrx,ExpressionChangedAfterItHasBeenCheckedError

Drupal 7:使一个字段的值依赖于其他字段值

当另一个字段更新时更新字段的模式的标准实践

根据另一个字段更新一个字段

在 Android MVVM 中更改另一个字段时更新字段

仅在mongodb中的字段小于另一个字段时更新

Oracle:在更新具有多个列的表的一个字段时复制行

汇总时如何自动添加除一个字段以外的所有字段?

Angular 7 NGRX存储具有未定义状态

Django Rest更新一个字段

Elasticsearch在搜索时排除一个字段

选择案例/根据另一个字段更新一个字段

如何使一个字段更新/更改另一个字段?

当另一个字段值更改时更新一个字段值

试图基于一个字段获取DateDiff并更新另一个字段

在一个字段中输入数据并自动更新另一个字段

更新一个字段以递增,直到另一个字段更改

如何在反应中根据另一个字段更新一个字段?

当SQL中的一个字段为空时,如何显示所有记录?

当您在另一个字段中输入值时如何更新表单字段

在Cloud Firestore中创建另一个字段时,如何更新文档中的字段?

在另一个字段上选择项目时更新动态表单字段

Angular 8更新文本字段以响应另一个字段更改

Laravel更新字段,带有另一个字段值

Angular 6仅需要多个字段中的一个字段

Mongodb 更新文档中的一个字段,然后根据前一个字段的值更新另一个

Blazor在一个字段中设置DateTime值会更新另一个字段中的DateTime值

mysql触发器更新新添加的行的一个字段