我开始使用ngrx/entity
软件包,可以在其中管理适配器的存储。我想使用addOne
方法,但是它将项目添加到集合的末尾。我想在开始时添加一个。你能帮我吗?如何以EntityAdapter
开头添加项目。
我如何创建实体适配器:
export const adapter: EntityAdapter<AssetTreeNode> = createEntityAdapter({
selectId: (model: AssetTreeNode) => model.Id
});
Reducer看起来像这样:
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;
}
}
答案 0 :(得分:1)
更改此行为的唯一方法是在创建适配器-docs时使用sortComparer
。
export const adapter: EntityAdapter<User> = createEntityAdapter<User>({
sortComparer: (a: User, b: User) => a.name.localeCompare(b.name),
});
答案 1 :(得分:0)
也许您可以将该项目放在开头并替换列表
on(addAsset, (state, { payload }) => {
const currentList = Object.values(state.entities);
const newList = [payload, ...currentList];
return adapter.setAll(newList, state);
});
答案 2 :(得分:0)
@ngrx/entity 团队没有提供适当的方法。答案之一提到使用排序比较器。但我相信使用排序比较器不是正确的方法。假设有两个点击动作,在一个动作中我们需要在下面附加项目,在另一个动作中附加在上面。在这里,我们将再次遇到同样的问题。
我遇到了同样的问题,我解决这个问题的方法是在我们想要列表顶部的项目时重建列表。
const { selectAll } = myAdapter.getSelectors();
...
...
on(MyActions.addItem, (state, { item }) =>{
return myAdapter.setAll([item ,...selectAll(state)], { ...state})
}),
on(MyActions.addItem, (state, { item}) =>{
return myAdapter.addOne(item, state)
}),