如何在 ngrx/entity 的集合开头添加一个项目

mag*_*gos 7 redux ngrx ngrx-entity

我开始使用ngrx/entity包,在那里我可以通过适配器管理存储。有一种addOne方法我想使用,但它将项目添加到集合的末尾。我想在开头添加一个。你能帮我解决这个问题吗?如何在开头添加项目EntityAdapter

我如何创建实体适配器:

export const adapter: EntityAdapter<AssetTreeNode> = createEntityAdapter({
  selectId: (model: AssetTreeNode) => model.Id
});
Run Code Online (Sandbox Code Playgroud)

减速器看起来像这样:

export function reducer(state: AssetListState = initialState, action: AssetListAction) {
  switch (action.type) {
    (...)
    case ASSET_LIST_ADD_ITEM:
      let assetToAdd: AssetTreeNode = Object.assign({} as AssetTreeNode, 
        action.payload.asset, 
        { Id: action.payload.createdAssetId });
      return adapter.addOne(assetToAdd, state); <--- I wanna add here at the end.
    (...)
    default:
      return state;
  }
}
Run Code Online (Sandbox Code Playgroud)

Ram*_*ami 7

@ngrx/entity 团队没有提供正确的方法。答案之一提到使用排序比较器。但我相信使用排序比较器不是正确的方法。假设有两个点击操作,在一个操作中我们需要在下面附加项目,在其他操作中在顶部附加项目。在这里我们将再次遇到同样的问题。

我遇到了同样的问题,我的解决方案是当我们希望该项目位于列表顶部时重建列表。

添加到实体列表顶部

const { selectAll } = myAdapter.getSelectors();
...
...
on(MyActions.addItem, (state, { item }) =>{
    return myAdapter.setAll([item ,...selectAll(state)], { ...state})
}),
Run Code Online (Sandbox Code Playgroud)

添加到实体列表底部

on(MyActions.addItem, (state, { item}) =>{
   return myAdapter.addOne(item, state)
}),
Run Code Online (Sandbox Code Playgroud)


tim*_*ver 4

sortComparer更改此行为的唯一方法是在创建适配器时使用文档。

export const adapter: EntityAdapter<User> = createEntityAdapter<User>({
  sortComparer: (a: User, b: User) => a.name.localeCompare(b.name),
});
Run Code Online (Sandbox Code Playgroud)