на самом деле я использую NGRX (Redux для Angular). Сначала я начал хранить свои сущности в виде массивов внутри моего состояния. После прочтения некоторых статей я хочу сохранить свои сущности в виде хэшей, в то время как я считаю, что более эффективный доступ к сущностям сущностей с использованием идентификатора вместо фильтрации массива.
Но я на самом деле не уверен, правильно ли это делать.
Не стесняйтесь проверить мой (рабочий, но лучший метод?) Образец здесь:
Образец статей Ngrx
Внутри article.component вы найдете articleReducer и ArticlesComponent, которые будут использовать магазин, чтобы получить все статьи и получить одну конкретную статью.
Для каждой неуверенной части я комментирую это с помощью QUESTION x - ...
Если вы не хотите проверять полный образец, вот фрагменты вопросов:
Вопрос 0:
export const initialState: ArticleState = {
foo: 'bar',
articlesById: [], // QUESTION 0: What is a good usecase to hold an array with the id's when Object.keys(hash) will give the same?
articleEntities: {}
}
Вопрос 1 + 2:
case GET_ALL_ARTICLES: {
// QUESTION 1: is this a good choice? Or is there a better alternative to create the hash?
const articleHash: { [id: number]: Article} = {};
action.payload.forEach(article => articleHash[article.id] = article);
return {
...state,
// QUESTION 2: is this a good choice? Or is there a better alternative?
articlesById: action.payload.map(article => article.id),
articleEntities: articleHash
}
}
Вопрос 3:
// QUESTION 3 - Getting all articleEntities as Array for ngFor : is this a good choice? Or is there a better alternative?
this.articles$ = this.store.pipe(
select('articles', 'articleEntities'),
map(entities => Object.keys(entities).map(id => entities[id]))
);
Вопрос 4:
const givenIdByRouterMock = 2;
// QUESTION 4 - Getting one concrete Article for given id : is this a good choice? Or is there a better alternative?
this.article$ = this.store.pipe(
select('articles', 'articleEntities'),
map(entities => entities[givenIdByRouterMock])
);
Если я обновлю какую-то статью (например, с идентификатором 2), используя новое действие, я хочу, чтобы компонент, включающий статью, был обновлен.
Это допустимые варианты или есть лучшие варианты, решения? Не стесняйтесь раскошелиться на образец stackblitz с другими вариантами / фрагментами кода.
Спасибо!