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

时间:2019-02-15 08:25:14

标签: angular ngrx ngrx-store ngrx-entity

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

已编辑

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

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

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

目前,我正在欺骗,因为第二个参数提供了初始状态

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

1 个答案:

答案 0 :(得分: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()对结果进行排序。

还原剂:(州)

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 参数,以便可以从选择器中访问排序参数。

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