1

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

已编辑

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

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

我知道问题出在此处, ...state.entity1因为我连接了与有效负载提供的相同的数组。只是位置发生了变化。

目前,我做了一个技巧,因为第二个参数提供了初始状态

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

1 回答 1

0

我通过在选择器函数中添加排序方法解决了这个问题,并在实体状态中添加了一个参数来保存顺序,这是我提出的解决方案:

选择器:

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

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

于 2020-04-04T10:55:58.537 回答