Reaction-admin: изменение списка из магазина без http запросов - PullRequest
0 голосов
/ 17 мая 2019

Я использую act-admin , и мне нужно напрямую управлять хранилищем из одного ресурса, в моем случае, ресурса orders.

Каждый раз, когда я запускаю GET_LIST, он добавляет новые записи в список из хранилища, но я хотел бы получить новый список с сервера и удалить старые. Вот где я получаю записи:

    dataProvider(GET_LIST, 'orders', {
        filter: { updatedAt: filterDate }, // Get date from Filter.
        sort: { field: 'updatedAt', order: 'DESC' },
        pagination: { page: 1, perPage: 999 },
    }).then(response => response.data)

Итак, я решил напрямую манипулировать магазином и после некоторого копания я увидел ответ и этот код из источника:

const dataReducer: Reducer<RecordSetWithDate> = (
    previousState = initialState,
    { payload, meta }
) => {
    if (meta && meta.optimistic) {
        if (meta.fetch === UPDATE) {
            const updatedRecord = {
                ...previousState[payload.id],
                ...payload.data,
            };
            return addRecords([updatedRecord], previousState);
        }
        if (meta.fetch === UPDATE_MANY) {
            const updatedRecords = payload.ids.map(id => ({
                ...previousState[id],
                ...payload.data,
            }));
            return addRecords(updatedRecords, previousState);
        }
        if (meta.fetch === DELETE) {
            return removeRecords([payload.id], previousState);
        }
        if (meta.fetch === DELETE_MANY) {
            return removeRecords(payload.ids, previousState);
        }
    }
    if (!meta || !meta.fetchResponse || meta.fetchStatus !== FETCH_END) {
        return previousState;
    }

    switch (meta.fetchResponse) {
        case GET_LIST:
        case GET_MANY:
        case GET_MANY_REFERENCE:
            return addRecords(payload.data, previousState);
        case GET_ONE:
        case UPDATE:
        case CREATE:
            return addRecords([payload.data], previousState);
        default:
            return previousState;
    }
};

Итак, на основании этого я создал пользовательское действие, чтобы удалить старые идентификаторы из моего списка и добавить новые, полученные из источника данных:

   import {GET_LIST, DELETE_MANY, FETCH_END } from 'react-admin';
    export const UPDATE_ORDER_ADMIN = 'UPDATE_ORDER_ADMIN';
    export const update_orders_admin = (data, oldIDS) => ({
        type: UPDATE_ORDER_ADMIN,
        payload: { data, ids: oldIDS },
        meta: {
            resource: 'orders',
            optimistic: true,
            fetch: DELETE_MANY,
            fetchResponse: GET_LIST,
            fetchStatus: FETCH_END,
        },
    });

И я использую это настраиваемое действие после извлечения данных из серверной части:

   dataProvider(GET_LIST, 'orders', {
        filter: { updatedAt: filterDate }, // Get date from Filter.
        sort: { field: 'updatedAt', order: 'DESC' },
        pagination: { page: 1, perPage: 999 },
    }).then(response => response.data)
        .then(data => {
            const ids = orders ? Object.keys(orders) : [];
            update_orders_admin(data, ids);
            this.setState({ isLoading: false })
            return null;
        });

Однако система вызывает действие DELETE из бэкэнда, пытаясь удалить записи из базы данных, в то время как я хотел бы просто удалить эти записи из моего представления.

Есть мысли?

1 Ответ

0 голосов
/ 20 мая 2019

В вашем настраиваемом действии выборка установлена ​​как DELETE_MANY , которая будет выполнять цикл по каждому идентификатору, выполняющему DELETE операцию.Не уверен, что ваша реализация будет работать, но текущая ошибка об этом.Вы можете попытаться удалить извлечение и посмотреть, что произойдет, но я думаю, что без него он не будет извлекать записи.Если я не ошибаюсь, RA только добавляет новые идентификаторы к данным, однако, если данные за это время изменились, я не думаю, что они заменят измененные данные, для этого вам нужно переопределить поставщика данных, чтобы изменить поведение данных обновления, которое аналогичнок тому, что вы пытаетесь.

...