ngrx store выберите подписаться только на конкретные действия - PullRequest
2 голосов
/ 28 марта 2019

Я хотел бы знать, возможно ли отфильтровать store.select подписку по действиям (как мы делаем в Effects). Смотрите код ниже:

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

Каждый раз , когда отправляется действие (не имеет значения, какое действие), будет вызываться каждый отдельный активный компонент (не уничтоженный и не отписанный), который имеет store.select.subscribe.

Если наше приложение имеет 100 действий, то при каждом запуске 1 действия будут вызываться все активные компоненты ( не уничтожены или не подписаны ) store.select.subscribe. (Если состояние, которое влияет на компонент, не изменилось, я знаю, что у нас не возникнет никаких проблем, так как состояние остается прежним).

Почему я задаю этот вопрос?

Иногда мне нужно выполнять какое-то действие в моем компоненте каждый раз, когда изменяется состояние, которое его затрагивает. Поэтому каждый раз, когда мне нужно сделать оператор 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 Ответ

1 голос
/ 28 марта 2019

Это невозможно, селектор реагирует на изменение состояния.

Мне немного странно, что каждый селектор генерирует новый результат, когда вы отправляете действие.Только селекторы, затронутые изменением состояния, должны генерировать новый результат, потому что внутренне селектор кэширует вход, и если вход не изменяется, он не будет выполняться.

Из документов :

При использовании функций createSelector и createFeatureSelector @ ngrx / store отслеживает последние аргументы, в которых была вызвана ваша функция селектора.Поскольку селекторы являются чистыми функциями, последний результат может быть возвращен, когда аргументы совпадают, без повторного вызова вашей функции селектора.Это может обеспечить повышение производительности, особенно с селекторами, которые выполняют дорогостоящие вычисления.Эта практика известна как запоминание.

Если у вас есть репродукция, я с удовольствием посмотрю.

...