Подписка NGXS на переменную Select не работает

Я использую angular 11 с NGXS. У меня проблема с подпиской на переменную в состоянии У меня есть эта подписка:

@Select(state => state.alert.alerts)
alerts$: Observable<any[]>
ngOnInit(): void {
this.alerts$.subscribe(alerts => {
      if (alerts) {
        this.alertSubject.next(alerts[0])
      }
    })
}

и подписка не работает при изменении объекта в состоянии

Мое состояние:

@Action(AddAlertAction)
addAlert(ctx: StateContext<AlertStateModel>, { text, type }: AddAlertAction) {
    const alerts = ctx.getState().alerts
    alerts.push({ text, type })
    ctx.patchState({ alerts })
  }

и это состояние работает правильно, но в функции подписки ngOnInit не работает. Заранее спасибо за помощь


person Mateusz Sobczak    schedule 23.03.2021    source источник


Ответы (1)


вам не следует использовать push-прототип при обновлении среза состояния, если вы не обрабатываете неизменяемость вручную. альтернативный блок кода для неизменяемости, обрабатываемый самим ngxs, может быть следующим

@Action(AddAlertAction)
addAlert({ patchState }: StateContext<AlertStateModel>, { text, type }: AddAlertAction) {
    const { alerts } = getState();
    
    patchState({ ...alerts, { text, type } });
}
person cagcak    schedule 04.04.2021
comment
все еще не работает. мое и ваше решение успешно обновляют переменную состояния, но затем подписка в компоненте не работает - person Mateusz Sobczak; 04.04.2021
comment
если срез состояния меняется, значит подписка должна работать. Можете ли вы подтвердить, что это не так, добавив журнал в тело функции обратного вызова подписки. и, кстати, это всегда будет так, если это всегда массив if (alerts) { - person cagcak; 04.04.2021