Angular 角度NGRX:无法基于id在NGRX实体中选择单个值

Angular 角度NGRX:无法基于id在NGRX实体中选择单个值,angular,typescript,dictionary,ngrx,ngrx-entity,Angular,Typescript,Dictionary,Ngrx,Ngrx Entity,我正在尝试从实体状态中按Id选择对象。下面是我的减速机 export interface MessageState extends EntityState<Message> { // additional entities state properties loaded: boolean; loading: boolean; } export const adapter: EntityAdapter<Message> = createEntityAdapt

我正在尝试从实体状态中按Id选择对象。下面是我的减速机

 export interface MessageState extends EntityState<Message> {
  // additional entities state properties
  loaded: boolean;
  loading: boolean;
}

export const adapter: EntityAdapter<Message> = createEntityAdapter<Message>({
  selectId: (msg: Message) => msg.messageId,
});

export const initialState: MessageState = adapter.getInitialState({
  // additional entity state properties
  loaded: false,
  loading: false,
});

export function reducer(state = initialState, action: MessageActionsUnion): MessageState {
  switch (action.type) {

    case MessageActionTypes.UPSERT_Message: {
      return { ...state, loading: true, loaded: false };
    }

    case MessageActionTypes.UPSERT_Message_SUCCESS: {
      return adapter.upsertOne(action.payload.Message,
        {
          ...state, loaded: true, loading: false,
        });

    }

    default: {
      return state;
    }
  }
}

我查看了许多参考资料,但没有一个是关于如何通过传递id来选择对象的明确信息。

@ngrx/entity
不提供
getOneById
选择器

在大多数情况下,这是你不应该做的事情

也就是说,有一些方法可以创建一个选择器来实现这一点,有关更多信息,请参阅(NgRx:Parameterized selectors)[

例如:

export const getCount = createSelector(
  getCounterValue, 
  (counter, props) => counter * props.multiply
);

export const selectCustomer = (id: string) => createSelector(
  selectCustomers,
  customers => customers[id]
);

@ngrx/entity
不提供
getOneById
选择器

在大多数情况下,这是你不应该做的事情

也就是说,有一些方法可以创建一个选择器来实现这一点,有关更多信息,请参阅(NgRx:Parameterized selectors)[

例如:

export const getCount = createSelector(
  getCounterValue, 
  (counter, props) => counter * props.multiply
);

export const selectCustomer = (id: string) => createSelector(
  selectCustomers,
  customers => customers[id]
);

@ngrx/entity
在版本6.1.0()后提供了getEntityValueById,在版本中引入了
字典

因此,使用这个,我能够通过下面的方式通过实体id提取实体的单个值

// in the selector
import { Dictionary} from '@ngrx/entity;

export const getMessageById = () => {
  return createSelector(
    selectMessagesEntities,                
    (entities: Dictionary<Message>, props: { messageId: number }) => {
      return entities[props.messageId];
    },
  );
};


//to call the selector


this.msg$ = this.store.pipe(select(
      fromStore.getMessageById(), { messageId: 10 }
    )).pipe(
      map(
        (message: Message) => {
          return this.msg = message;
        },
      )
    );
//在选择器中
从'@ngrx/entity'导入{Dictionary};
导出常量getMessageById=()=>{
返回createSelector(
选择MessageSenties,
(实体:字典,道具:{messageId:number})=>{
返回实体[props.messageId];
},
);
};
//调用选择器
this.msg$=this.store.pipe(选择(
fromStore.getMessageById(),{messageId:10}
)).烟斗(
地图(
(消息:消息)=>{
返回this.msg=消息;
},
)
);
此外,还记录了该方法的重要参考资料

因此,使用这个,我能够通过下面的方式通过实体id提取实体的单个值

// in the selector
import { Dictionary} from '@ngrx/entity;

export const getMessageById = () => {
  return createSelector(
    selectMessagesEntities,                
    (entities: Dictionary<Message>, props: { messageId: number }) => {
      return entities[props.messageId];
    },
  );
};


//to call the selector


this.msg$ = this.store.pipe(select(
      fromStore.getMessageById(), { messageId: 10 }
    )).pipe(
      map(
        (message: Message) => {
          return this.msg = message;
        },
      )
    );
//在选择器中
从'@ngrx/entity'导入{Dictionary};
导出常量getMessageById=()=>{
返回createSelector(
选择MessageSenties,
(实体:字典,道具:{messageId:number})=>{
返回实体[props.messageId];
},
);
};
//调用选择器
this.msg$=this.store.pipe(选择(
fromStore.getMessageById(),{messageId:10}
)).烟斗(
地图(
(消息:消息)=>{
返回this.msg=消息;
},
)
);
此外,还记录了该方法的重要参考资料
.

也许只是我,但我在这里看不到任何东西试图通过传递某个Id来选择任何对象……我猜你想通过Id来获取这条神秘的消息……但我看不到这些消息的存储空间。我完全不清楚你想做什么。也许只是我,但我在这里看不到任何东西hat试图通过在某处传递一些Id来选择任何对象…我猜您希望通过其Id获取此神秘消息…但我看不到这些消息的存储空间。完全不清楚您想做什么。为什么我不需要
getOneById
?选择列表中的特定项似乎是默认的gree和@Deitsch在这里。我反复遇到的用例是我想在我的reducer中的单个实体上更新一个或两个属性。除了通过id选择一个实体,更新所需的属性,然后用upsertOne()将其写回存储之外,我看不到其他方法。为什么我不需要
getOneById
?在这里选择列表中的特定项似乎非常默认地使用@Deitsch。我反复遇到的用例是我想在我的reducer中的单个实体上更新一个或两个属性。除了通过id选择一个实体,更新所需的属性之外,我看不到其他方法ies然后使用upsertOne()将其写回存储。