NGRX如何处理在后端执行的排序

问题描述 投票:1回答:1

处理后端执行的排序实体的最佳方法是什么?当前,我的状态无法识别,当我使用适配器添加已排序的项目时,某些项目已更改,而项目仍与排序之前相同,但它们在数组中的位置已更改。

编辑

我从后端接收排序后的元素,然后将其添加到当前的实体中,但是当实体的所有属性都相同并且将其视为未发生任何变化时,状态无法识别位置变化。

state{
...state
entity1: adapter.addMany(payload {
  ...state.entity1
  loaded: true
 )
}

我知道问题出在这里...state.entity1因为我连接了与有效负载提供的数组相同的数组。仅更改位置。

当前,我把戏了,因为第二个参数提供了初始状态

state{
...state
entity1: adapter.addMany(payload,               
adapter.getInitialState({
            loaded: true
  })
}
angular ngrx ngrx-store ngrx-entity
1个回答
0
投票

我通过在选择器函数中添加排序方法解决了这个问题,并在Entity状态下添加了参数以保存订单,这是我的解决方案:

选择器:

export const selectCategoriesInStore = createSelector(
    selectCategoriesState,
    categoriesState => {
        const items: CategoryModel[] = [];
        each(categoriesState.entities, element => {
            items.push(element);
        });
        const httpExtension = new HttpExtenstionsModel();
        const result: CategoryModel[] = httpExtension.sortArray(items, categoriesState.lastQuery.sortField, categoriesState.lastQuery.sortOrder);
        return new QueryResultsModel(result, categoriesState.totalCount, '');
    }
);

您可以在这里看到我使用httpExtension.sortArray()方法对结果进行排序。

Reducer:(State)

export interface CategoryState extends EntityState<CategoryModel> {
    listLoading: boolean;
    actionsLoading: boolean;
    totalCount: number;
    lastCreatedCategoryId: number;
    lastQuery: QueryParamsModel;
    showInitWaitingMessage: boolean;
    error: any;
    lastAction: string;
    progress: number;
}

我添加了lastQuery参数,因此我可以从选择器中访问排序参数。

如果您使用的是页面,也不要忘记从后端对数据进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.