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