Используйте одно хранилище угловых сигналов для нескольких функций (компонентов)

Я определил хранилище угловых сигналов в компоненте родительской таблицы и обновил данные, используя

patchState
export const TableStore = signalStore(
  { providedIn: 'root' },
  withRouteParams({ id: param => Number(param) }),
  withState(tableInitialState),
  withMethods((store, tableApiService = inject(TableApiService)) => ({
    getRows: rxMethod<number>(
      pipe(
        switchMap(structureId => {
          patchState(store, { loading: true });
          return tableApiService.getData(id).pipe(
            tap({
              next: (data: any) =>
                patchState(store, {
                  rows: data.rows,
                }),
              error: () =>
                patchState(store, {
                  rows: tableInitialState.rows,
                  loading: false,
                }),
              finalize: () => patchState(store, { loading: false }),
            })
          );
        })
      )
    ),
    addRow: rxMethod<Row>(...)
    ),
  })),

Приведенный выше код работает должным образом, и доступ к строкам можно получить через

store.rows()

В таблице есть действие редактирования, которое открывает компонент диалогового окна для выбранной строки. В компоненте диалога я пытаюсь получить эти строки из того же хранилища сигналов;

export class DialogComponent {
   tableStore = inject(TableStore);

   ngOnInit() {
     console.info(this.tableStore.rows()); <== EMPTY ARRAY??
   }
}

но данных нет.

Кто-нибудь знает, почему? Я предполагал, что хранилище сигналов таблицы является хранилищем уровня домена, и его состояние может использоваться несколькими функциями в одном домене.

Я попытался получить данные из хранилища таблиц в компоненте диалога и создать другое хранилище диалогов, чтобы внедрить хранилище таблиц и получить данные оттуда, но строки также пусты.

export const DialogStore = signalStore(
  withMethods(
    (
      dialogStore,
      tableStore = inject(TableStore),
      tableApiService = inject(TableApiService)
    ) => ({
     updateRow: rxMethod<Row>(
        pipe(
          switchMap(updatedRow => {
            patchState(tableStore, { loading: true });
            return tableApiService
              .updateRow(updatedRow.id, updatedRow )
              .pipe(
                tapResponse({
                  next: () => {
                    console.info(tableStore.rows()), <= EMPTY ARRAY
                      patchState(tableStore, {
                        rows: tableStore
                          .rows()
                          .map(row =>
                            row.rowId === updatedRow.rowId
                              ? { ...row }
                              : row
                          ),
                      });
                    console.info(tableStore.rows()); <= EMPTY ARRAY
                  },
              );
          })
        )
      ),
})
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы указали свой TableStore в разделе «один или несколько компонентов» providers: []. По этой причине в приложении существует несколько независимых экземпляров TableStore.

учитывая, что вы используете { providedIn: 'root' },, вы можете просто удалить его из всех массивов providers, и тогда он должен работать

При удалении TableStore из массива провайдеров метод getRows не выполняется, хотя есть вызов метода constructor() { super(); this.tableStore.getRows(id); }

glistolin 16.06.2024 09:32

есть ли ошибки в консоли?

Andrei 16.06.2024 11:10

В консоли ошибок нет, метод по какой-то причине просто не вызывается.

glistolin 16.06.2024 13:43

Переместите getRows на withHooks() вместо withMethods(). есть крючок onInit(), который будет выполняться при инъекции магазина.

SergioZhydecky 02.07.2024 23:58

Другие вопросы по теме