如何使用NGRX实体和多个还原器从商店NGRX获取价值

发布于 2025-01-28 19:37:53 字数 5318 浏览 4 评论 0原文

我是NGRX实体的新手,也是Angular。 我正在尝试使用NGRX将数据存储在商店中,并使用多个还原器存储。 我认为做得很好,但是问题是我不知道如何从商店中获得价值以通过选择器在我的组件中显示。 对于该示例,使用2个还原式

ACCUEIL-ENTITITITITITY-REDUCER.TS

import { createEntityAdapter, EntityAdapter, EntityState } from '@ngrx/entity';
import { IEntities } from './../../main/pages/accueil/model/i-entities';

export interface IEntitiesState extends EntityState<IEntities>
{
  allEntitiesLoaded: boolean;
}

export const adapterEntities: EntityAdapter<IEntities> = createEntityAdapter<IEntities>({
  selectId: entity => entity.stc_Id
});

export const initialEntitiesState = adapterEntities.getInitialState({
  allEntitiesLoaded: false
});

export const {
  // select the array of Entities ids
  selectIds: selectEntitiesIds,

  // select the dictionary of entities
  selectEntities: selectDictionaryOfEntities,

  // select the array of Entities
  selectAll: selectAllEntities,

  // select the total Entities count
  selectTotal: selectEntitiesTotal
} = adapterEntities.getSelectors();

ACCUEIL-SERCHACTIFS-REDUCER.TS

import { createReducer } from '@ngrx/store';
import { createEntityAdapter, EntityAdapter, EntityState } from '@ngrx/entity';
import { IEntitiesQuickSearchActifs } from 'src/app/main/pages/accueil/model';

export interface IEntitiesQuickSearchActifsState extends EntityState<IEntitiesQuickSearchActifs>
{
  allActifsLoaded: boolean;
}

export const adapter: EntityAdapter<IEntitiesQuickSearchActifs> = createEntityAdapter<IEntitiesQuickSearchActifs>({
  selectId: actif => actif.atf_Id
});

export const initialSearchActifsState = adapter.getInitialState({
  allActifsLoaded: false
});

export const searchActifsReducer = createReducer(
  initialSearchActifsState,
 );


export const {
  selectAll
} = adapter.getSelectors();

ACCUEIL-REDUCER.TS

import { createReducer, on } from '@ngrx/store';
import { fromAccueilActions } from "../actions/accueil-actions-types";
import * as fromAccueilEntitiesReducer from "./accueil-entities-reducer";
import * as fromAccueilQuickSearchActifsReducer from "./accueil-searchactifs-reducer";

export interface AccueillState {
  entities: fromAccueilEntitiesReducer.IEntitiesState;
  QuickSearchActifs: fromAccueilQuickSearchActifsReducer.IEntitiesQuickSearchActifsState;
  selectedCategory: string;
}
export const initialAccueillState: AccueillState = {
  entities: fromAccueilEntitiesReducer.initialEntitiesState,
  QuickSearchActifs: fromAccueilQuickSearchActifsReducer.initialSearchActifsState,
  selectedCategory: "NON-FICTION",
};

export const selectEntitiesIds = fromAccueilEntitiesReducer.selectEntitiesIds;
export const selectDictionaryOfEntities = fromAccueilEntitiesReducer.selectDictionaryOfEntities;
export const selectAllEntities = fromAccueilEntitiesReducer.selectAllEntities;
export const selectEntitiesTotal = fromAccueilEntitiesReducer.selectEntitiesTotal;

export const selectAllSearchActifs = fromAccueilQuickSearchActifsReducer.selectAll;

export const accueilReducer = createReducer(
  initialAccueillState,
  on(fromAccueilActions.allEntitiesLoaded, (state, {entities}) => {
    return {
      ...state,
      entities: fromAccueilEntitiesReducer
                .adapterEntities
                .addMany(entities,
                  {
                    ...state.entities,
                    allEntitiesLoaded: true
                  }),

    };
  }),
);

ACCUEIL-SELECTOR.TS

import { createFeatureSelector, createSelector } from '@ngrx/store';
import { ACCUEIL_FEATURE_NAME } from 'src/app/main/pages/accueil/accueil.module.state';
import * as fromAccueil from '../reducers/accueil-reducer'
import { AccueillState } from '../reducers/accueil-reducer';

export const selectAccueillState = createFeatureSelector<AccueillState>(ACCUEIL_FEATURE_NAME);

// select the array of Entities ids
const selectEntitiesIds = createSelector(
  selectAccueillState,
  state => fromAccueil.selectEntitiesIds
);

 // select the dictionary of entities
 const selectDictionaryOfEntities = createSelector(
  selectAccueillState,
  state => fromAccueil.selectDictionaryOfEntities
);

 // select the array of Entities
 const selectAllEntities = createSelector(
  selectAccueillState,
  state => fromAccueil.selectAllEntities
);


export const EntitiesQuery = {
  selectEntitiesIds,
  selectDictionaryOfEntities,
  selectAllEntities,
};

accueil.component.ts

   this.store.select(EntitiesQuery.selectAllEntities)
  .subscribe(
    {
         next:(data) =>{
           debugger;
             this.treeEntitieDataSource = data;  ===> Error here I should have here IEntities[], but I don´t.
            // the error is Type 'Observable<(state: EntityState<IEntities>) => IEntities[]>' is not assignable to type 'Observable<IEntities[]>'.
           console.log("Retrieve list of Entities from store with sucess")
          },
         error:(error) =>{
           debugger;
           console.log("Retrieve list of Entities from store with error:"+ error)},

         complete:()=>{
           debugger;
           console.log("Retrieve list of Entities from store")},
        }
    );

您可以帮助我,您可以帮助我, 提前致谢。

I am newbie with ngrx entity, and also in angular.
I am trying to store data in the store with ngrx, with multiple reducers.
I think am doing well, but the problem is I don´t know howto get the value from the store to display in my component by the selector.
For the example am using 2 reducer

accueil-entities-reducer.ts

import { createEntityAdapter, EntityAdapter, EntityState } from '@ngrx/entity';
import { IEntities } from './../../main/pages/accueil/model/i-entities';

export interface IEntitiesState extends EntityState<IEntities>
{
  allEntitiesLoaded: boolean;
}

export const adapterEntities: EntityAdapter<IEntities> = createEntityAdapter<IEntities>({
  selectId: entity => entity.stc_Id
});

export const initialEntitiesState = adapterEntities.getInitialState({
  allEntitiesLoaded: false
});

export const {
  // select the array of Entities ids
  selectIds: selectEntitiesIds,

  // select the dictionary of entities
  selectEntities: selectDictionaryOfEntities,

  // select the array of Entities
  selectAll: selectAllEntities,

  // select the total Entities count
  selectTotal: selectEntitiesTotal
} = adapterEntities.getSelectors();

accueil-searchactifs-reducer.ts

import { createReducer } from '@ngrx/store';
import { createEntityAdapter, EntityAdapter, EntityState } from '@ngrx/entity';
import { IEntitiesQuickSearchActifs } from 'src/app/main/pages/accueil/model';

export interface IEntitiesQuickSearchActifsState extends EntityState<IEntitiesQuickSearchActifs>
{
  allActifsLoaded: boolean;
}

export const adapter: EntityAdapter<IEntitiesQuickSearchActifs> = createEntityAdapter<IEntitiesQuickSearchActifs>({
  selectId: actif => actif.atf_Id
});

export const initialSearchActifsState = adapter.getInitialState({
  allActifsLoaded: false
});

export const searchActifsReducer = createReducer(
  initialSearchActifsState,
 );


export const {
  selectAll
} = adapter.getSelectors();

accueil-reducer.ts

import { createReducer, on } from '@ngrx/store';
import { fromAccueilActions } from "../actions/accueil-actions-types";
import * as fromAccueilEntitiesReducer from "./accueil-entities-reducer";
import * as fromAccueilQuickSearchActifsReducer from "./accueil-searchactifs-reducer";

export interface AccueillState {
  entities: fromAccueilEntitiesReducer.IEntitiesState;
  QuickSearchActifs: fromAccueilQuickSearchActifsReducer.IEntitiesQuickSearchActifsState;
  selectedCategory: string;
}
export const initialAccueillState: AccueillState = {
  entities: fromAccueilEntitiesReducer.initialEntitiesState,
  QuickSearchActifs: fromAccueilQuickSearchActifsReducer.initialSearchActifsState,
  selectedCategory: "NON-FICTION",
};

export const selectEntitiesIds = fromAccueilEntitiesReducer.selectEntitiesIds;
export const selectDictionaryOfEntities = fromAccueilEntitiesReducer.selectDictionaryOfEntities;
export const selectAllEntities = fromAccueilEntitiesReducer.selectAllEntities;
export const selectEntitiesTotal = fromAccueilEntitiesReducer.selectEntitiesTotal;

export const selectAllSearchActifs = fromAccueilQuickSearchActifsReducer.selectAll;

export const accueilReducer = createReducer(
  initialAccueillState,
  on(fromAccueilActions.allEntitiesLoaded, (state, {entities}) => {
    return {
      ...state,
      entities: fromAccueilEntitiesReducer
                .adapterEntities
                .addMany(entities,
                  {
                    ...state.entities,
                    allEntitiesLoaded: true
                  }),

    };
  }),
);

accueil-selector.ts

import { createFeatureSelector, createSelector } from '@ngrx/store';
import { ACCUEIL_FEATURE_NAME } from 'src/app/main/pages/accueil/accueil.module.state';
import * as fromAccueil from '../reducers/accueil-reducer'
import { AccueillState } from '../reducers/accueil-reducer';

export const selectAccueillState = createFeatureSelector<AccueillState>(ACCUEIL_FEATURE_NAME);

// select the array of Entities ids
const selectEntitiesIds = createSelector(
  selectAccueillState,
  state => fromAccueil.selectEntitiesIds
);

 // select the dictionary of entities
 const selectDictionaryOfEntities = createSelector(
  selectAccueillState,
  state => fromAccueil.selectDictionaryOfEntities
);

 // select the array of Entities
 const selectAllEntities = createSelector(
  selectAccueillState,
  state => fromAccueil.selectAllEntities
);


export const EntitiesQuery = {
  selectEntitiesIds,
  selectDictionaryOfEntities,
  selectAllEntities,
};

accueil.component.ts

   this.store.select(EntitiesQuery.selectAllEntities)
  .subscribe(
    {
         next:(data) =>{
           debugger;
             this.treeEntitieDataSource = data;  ===> Error here I should have here IEntities[], but I don´t.
            // the error is Type 'Observable<(state: EntityState<IEntities>) => IEntities[]>' is not assignable to type 'Observable<IEntities[]>'.
           console.log("Retrieve list of Entities from store with sucess")
          },
         error:(error) =>{
           debugger;
           console.log("Retrieve list of Entities from store with error:"+ error)},

         complete:()=>{
           debugger;
           console.log("Retrieve list of Entities from store")},
        }
    );

Can you help me,
Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文