Я действительно новичок в NGRX и управлении состоянием. Я успешно реализовал свой первый ключ состояния, используя сущность и селекторы. Он загружает все с фасадом и эффектом в состояние с ключом containers
. Хотя я пытаюсь понять, как управлять массивом внутри этого первого загруженного массива объектов, у которых есть дополнительный массив. Должен ли это быть новый ключ состояния projections
или я могу управлять им из первого загруженного массива.
У меня есть два разных запроса graphql для тестирования. Один возвращает только контейнеры без projections
, а другой с projections
.
export const selectContainersLoaded = createSelector(
getFeatureState,
state => state.loaded
)
export const loadContainersSuccess = createAction(
'[Container] Load Containers Success',
props<{ payload: Container[] }>()
);
//without
{
containers: {
ids: [
'0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
],
entities: {
'0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx': {
__typename: 'Container',
id: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
name: 'Black Chevy',
description: 'Some testing description',
projections: {
__typename: 'ModelProjectionConnection',
nextToken: null
},
}
},
loaded: true
}
}
//with
{
containers: {
ids: [
'0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
],
entities: {
'0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx': {
__typename: 'Container',
id: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
name: 'Black Chevy',
description: 'Some testing description',
projections: {
__typename: 'ModelProjectionConnection',
items: [
{
__typename: 'Projection',
id: '0000002-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
containerId: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
name: 'testing projection'
},
{
__typename: 'Projection',
id: '0000003-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
containerId: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
name: 'another testing projection'
}
]
}
}
},
loaded: true
}
}
Из того, что я думаю, я читаю, так это то, что состояние должно быть сглажено и имитировать структуру базы данных, поэтому projections
является отдельной таблицей, тогда это будет означать другой ключ состояния для projections
. Но тут я в замешательстве. Если бы я хотел перечислить в представлении все контейнеры и под ними все проекции, как мне это соотнести? Я поиграл с идеей, что, возможно, проекции не должны быть отдельной таблицей через именованное соединение и просто массивом в контейнерах. Я также рассматривал использование селекторов внутри селекторов, но еще не понял этого. Что мне здесь не хватает? Я хочу иметь возможность самостоятельно обновлять проекцию, а контейнеру не обязательно иметь проекцию. Возможно, это слишком сложно с двумя разными таблицами, и было бы лучше использовать вспомогательные функции сущности для управления массивом внутри объекта. Но это просто заставляет меня задаться вопросом, как в более широком сценарии можно было бы добиться чего-то подобного.
state => {
containers,
projections
}
Если у вас есть примеры кода отношений «один ко многим» и, возможно, отношений «многие ко многим», которые сопоставляются с состоянием, было бы здорово. Я пытался посмотреть другие проекты кода на github, но я не нашел то, что, по моему мнению, ищу, даже если я не знаю или не понимаю, что я ищу.
combineLatest
иmap
, для извлечения нужных данных. Вы читали Запрос нормализованного состояния с помощью RxJS в Angular< /а>? Какие данные вам нужны в вашем представлении? Какую функцию вы ищете?getAllContainersWithTheirProjections()
? Может ли одна и та же проекция принадлежать нескольким контейнерам? - person frido   schedule 30.08.2020