Я определил хранилище угловых сигналов в компоненте родительской таблицы и обновил данные, используя
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
},
);
})
)
),
})





Кажется, вы указали свой TableStore в разделе «один или несколько компонентов» providers: []. По этой причине в приложении существует несколько независимых экземпляров TableStore.
учитывая, что вы используете { providedIn: 'root' },, вы можете просто удалить его из всех массивов providers, и тогда он должен работать
есть ли ошибки в консоли?
В консоли ошибок нет, метод по какой-то причине просто не вызывается.
Переместите getRows на withHooks() вместо withMethods(). есть крючок onInit(), который будет выполняться при инъекции магазина.
При удалении
TableStoreиз массива провайдеров методgetRowsне выполняется, хотя есть вызов методаconstructor() { super(); this.tableStore.getRows(id); }