传递给“selectId”实现的实体返回未定义。您可能应该提供自己的“selectId”实现

Tri*_*ong 6 ngrx ngrx-effects angular ngrx-store ngrx-entity

警告就在这里

在此输入图像描述

https://github.com/rokudo5262/phone这是我的项目,
我想加载智能表中的品牌列表,但收到警告,
我尝试修复,但警告仍然存在,请帮助
Brands-features.selector.ts

import { createFeatureSelector } from '@ngrx/store';
import { State, FeatureKey } from '../reducers';

export const selectBrandsState = createFeatureSelector<State>(FeatureKey);
Run Code Online (Sandbox Code Playgroud)

品牌.selector.ts

import { createSelector } from '@ngrx/store';
import { selectBrandsState } from './brands-features.selector';
import { BrandsReducer } from '../reducers';
import { brandAdapter } from '../states/brands.state';

export const selectBrandEntitiesState = createSelector(
  selectBrandsState,
  state => state[BrandsReducer.brandsFeatureKey],
);

export const {
  selectIds: selectBrandIds,
  selectEntities: selectBrandEntities,
  selectAll: selectAllBrands,
  selectTotal: selectTotalBrands,
} = brandAdapter.getSelectors(selectBrandEntitiesState);

export const BrandSelectors = {
  selectBrandEntitiesState,
  selectBrandIds,
  selectBrandEntities,
  selectAllBrands,
  selectTotalBrands,
};
export const selectCurrentBrand = (brand_id) => createSelector(
  selectBrandEntities,
  (brand) => brand[brand_id],
)
Run Code Online (Sandbox Code Playgroud)

选择器/index.ts

export * from './brands-features.selector';
import * as BrandsSelector from './brands.selector';

export {
    BrandsSelector,
};
Run Code Online (Sandbox Code Playgroud)

品牌减速机.ts

import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity';
import { IBrand } from '../../../@core/data/brands';

export interface BrandsState extends EntityState<IBrand> {
    selectedBrandID: number | string | null;
}
export const brandAdapter: EntityAdapter<IBrand> = createEntityAdapter<IBrand>({
    selectId: (brand: IBrand) => brand.brand_id,
    sortComparer: null,
});

export const brandInitialState: BrandsState = brandAdapter.getInitialState({
    selectedBrandID: null,
    entities: {
        0: {},
    },
});
Run Code Online (Sandbox Code Playgroud)

小智 6

createEntityAdapter有一个selectId函数,它需要id元素中的一个字段。

例子:

[
    { "id": 1, "name": "Lorem ipsum 1" },
    { "id": 2, "name": "Lorem ipsum 2" }
]
Run Code Online (Sandbox Code Playgroud)

但是,您的元素有id一个像这样的自定义字段:

[
    { "elementId": 1, "name": "Lorem ipsum 1" },
    { "elementId": 2, "name": "Lorem ipsum 2" }
]
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我重写了selectId方法,如下createEntityAdapter所示:

const elementAdapter = createEntityAdapter({
  selectId: (e) => e.elementId
});
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多信息:https://redux-toolkit.js.org/api/createEntityAdapter


Tri*_*ong 3

我发现了问题,结果发现问题是我的 '''brand_id''' 中的问题Brand Tableentity.Property(e => e.BrandId).HasColumnName("brand_id");而不是代码中的brand_id问题。Ibrand interface所以我将所有内容更改为brandCode并且警告消失了。


            modelBuilder.Entity<Brands>(entity =>
            {
                entity.HasKey(e => e.BrandCode)

                entity.Property(e => e.BrandCode).HasColumnName("brandCode");

                entity.Property(e => e.BrandName)
                    .HasColumnName("brandName")
                    .HasMaxLength(255);

                entity.Property(e => e.CreatedBy)
                    .HasColumnName("createdBy")
                    .HasMaxLength(255);

                entity.Property(e => e.CreatedDateTime)
                    .HasColumnName("createdDateTime")
                    .HasColumnType("datetime");

                entity.Property(e => e.Deleted).HasColumnName("deleted");

                entity.Property(e => e.Remark)
                    .HasColumnName("remark")
                    .HasMaxLength(255);

                entity.Property(e => e.Status)
                    .HasColumnName("status")
                    .HasMaxLength(255);

                entity.Property(e => e.UpdatedDateTime)
                    .HasColumnName("updatedDateTime")
                    .HasColumnType("datetime");

                entity.Property(e => e.Updatedby)
                    .HasColumnName("updatedby")
                    .HasMaxLength(255);
            });
Run Code Online (Sandbox Code Playgroud)
export const brandAdapter: EntityAdapter<IBrand> = createEntityAdapter<IBrand>({
    selectId: (brand: IBrand) => brand.brandCode,
    sortComparer: null,
});
Run Code Online (Sandbox Code Playgroud)
export interface IBrand {
    brandCode: number;
    brandName: string;
    status: string;
    remark: string;
    deleted: boolean;
    createdBy?: string;
    createdDateTime?: Date;
    lastUpdatedBy?: string;
    lastUpdatedDateTime?: Date;
}
Run Code Online (Sandbox Code Playgroud)