angular 7 ngrx запускает подписку на все поля при обновлении одного поля - PullRequest
0 голосов
/ 18 января 2020

Привет! Я использую 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
);

Тем временем я печатаю сообщение в редукторе, чтобы сделать уверен, что B обновляется как

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

И затем я использую этот BSelector в BComponent в следующих трех методах

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); в каждом методе не работает. Все три метода не печатают содержимое б.

1 Ответ

1 голос
/ 18 января 2020

Вам нужен файл селектора, и сделайте селекторы такими:

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

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

export const selectBvalue = createSelector(
  selectBState,
  state => state.value
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...