我无法从我的实体中删除项目,因为它保存了操作类型

I can't remove an item from my entity, because it saves the action type

我正在开发 angular 8,并将 "favorites" 添加到我的 ngrx 商店,我可以添加它们 select 它们没问题,但是我的删除操作失败了,因为(我认为)动作的类型被包含在项目中

这就是我创建实体和 store reducer 的方式:

export const adapter:EntityAdapter<Favorite>= createEntityAdapter<Favorite>();

export interface FavoriteState extends EntityState<Favorite> {}

export const selectors = adapter.getSelectors();

export class Favorite {
    id: number;
    username: string;
}

然后我创建了动作:

export const addFavoriteAction = createAction('[Favorite] Add Favorite', props<Favorite>());
export const getFavoritesAction = createAction('[Favorite] Get Favorite');
export const removeFavoritesAction = createAction('[Favorite] Delete Favorite', props<Favorite>());

我的减速器非常标准(我使用的是实体适配器)

// And finally, the reducer
const favoritesReducer = createReducer(initialState,
    on(getFavoritesAction, state => state),
    on(removeFavoritesAction, (state: FavoriteState, favorite: Favorite) => {
        return adapter.removeOne(favorite.username, state);
    }),
    on(addFavoriteAction, (state: FavoriteState, favorite: Favorite) => {
        return adapter.addOne(favorite, state);
    })
);

当我添加收藏夹时,用这个:

  addFavorite(username, id) {
    const newFavorite = new Favorite();
    newFavorite.username = username;
    newFavorite.id = id;

    this.favoriteStore.dispatch(addFavoriteAction(newFavorite));
  }

控制台显示我的实体添加正确,但是我的状态是这样的

state: {
entities:
233907: {username: "astaxie", id: 233907, type: "[Favorite] Add Favorite"}
10752102: {username: "libenhe", id: 10752102, type: "[Favorite] Add Favorite"}
20162049: {username: "testerSunshine", id: 20162049, type: "[Favorite] Add Favorite"}
21636478: {username: "TestLeafPages", id: 21636478, type: "[Favorite] Add Favorite"}
ids: (4) [233907, 10752102, 20162049, 21636478]
}

如您所见,状态中包含带有操作字符串的 "type" 属性(我不确定这是否正确)

所以当我尝试删除它时,使用我的函数:

 removeFavorite(selected: Favorite) {
    this.favoriteStore.dispatch(removeFavoritesAction(selected));
  }

它发送到reducer的"favorite"是这样输出的:

action {
   id: 21636478
   type: "[Favorite] Delete Favorite"
   username: "TestLeafPages"
}

据我了解,适配器中的 removeOne 将尝试在商店的实体数组中找到它,但由于操作字符串不同,它不会找到它,因此它不会删除它。

我做错了什么?

您需要像这样更改您的操作:

export const addFavoriteAction = createAction('[Favorite] Add Favorite', props<{favorite: Favorite}>());

你的减速器是这样的:

on(addFavoriteAction, (state: FavoriteState, { favorite } : { favorite : Favorite }) => {
        return adapter.addOne(favorite, state);
})

最后,要使用您的操作,请使用对象分派它们:this.favoriteStore.dispatch(addFavoriteAction({ favorite: myFav })