Извините, но это не очень хорошая практика. С управлением состоянием (шаблон избыточности) и, следовательно, ngrx
, вы должны нормализовать свой магазин.
Рекомендую прочитать для шаблона Redux .
Это означает, что в вашем случае у вас должна быть выделенная ngrx entity
для вашей Topping
модели.
Ваш магазин должен выглядеть следующим образом:
state {
pizzas: {
ids: [...]
entities: [
{'pizza1': {id: 'pizza1, name: 'Pizza 1', ...},
{'pizza2': {id: 'pizza2, name: 'Pizza 2', ...},
];
},
toppings: {
ids: [...]
entities: [
{'topping1': {id: 'topping1, pizzaId: 'pizza1', name: 'Topping 1', ...},
{'topping2': {id: 'topping2, pizzaId: 'pizza1', name: 'Topping 2', ...},
];
}
}
Затем через selectors
вы сможете получить список topppings
для выбранного pizza
:
getToppings = createSelector(getSelectedPizzaId, getAllToppings, (state, selectedPizzaId, allToppings) => {
return allToppings.filter(topping => topping.pizzaId === selectedPizzaId)
});
Для повышения производительности можно также рассмотреть возможность создания дополнительного третьего entity
, предназначенного для отношений между pizza
и toppings
:
store {
...
pizzaToppingIds {
entities: [
{'pizza1': { toppingIds: ['topping1', 'topping2']},
{'pizza2': { toppingIds: ['topping3', 'topping4']},
];
}
}
В этом случае selector
должно быть: (упрощенно, некоторые тесты отсутствуют ...)
getToppings = createSelector(getSelectedPizzaId, getPizzaToppingEntities, getToppingEntities, (state, selectedPizzaId, pizzaToppingEntities, toppingEntities) => {
return pizzaToppingEntities[selectedPizzaId].toppingIds
.map(id => toppingEntities[id];
});
Если вы действительно хотите повторить этот общий шаблон и передовой опыт, вы всегда можете рассмотреть вопрос об обновлении pizza
сущности каждый раз, когда добавляется topping
. Но это обновит весь entity
.
Еще раз, это будет работать, но state management
архитектура вашего приложения потеряет часть своего интереса и мощности.