реакции-админ исключают «запись» из редукс-формы - PullRequest
2 голосов
/ 05 марта 2019

У меня проблема, когда я отправляю SimpleForm (редактировать) запрос с реакцией admin. Запрос содержит больше параметров, чем у меня в полях формы.

Например, у меня есть форма:

<Edit {...props}>
    <SimpleForm>
        <TextInput source="title_new" />
        <TextInput source="age_new" />
    </SimpleForm>
</Edit>

Включает только 2 поля, но когда я нажимаю «сохранить», запрос включает дополнительные поля. Я понял, что эти поля приходят из запроса GET_ONE, который заполняет данные из БД.

GET_ONE:

{
title: 'title',
title_new: 'title-new',
age: 'age',
age_new: 'age-new',
}

Запрос на обновление ОБНОВЛЕНИЕ:

{
title: 'title',
title_new: 'title-new',
age: 'age',
age_new: 'age-new',
}

Я ожидаю, что ОБНОВЛЕНИЕ будет включать только поля форм (title_new и age_new) без полей title и age, которые взяты из "записи".

Эти поля доставляют мне много хлопот со стороны API, и я хочу избежать / исключить их из всех форм, в основном я хочу отправлять только входные данные формы только с входными данными SimpleForm.

Несколько решений, которые я имею в виду: 1. «Изменение значений формы перед отправкой» здесь 2. Манипулировать запросом в restProvider

Оба решения не годятся для меня, потому что у меня много подобных форм, и код restProvider будет выглядеть плохо. Также я не хочу «изменять» какую-либо форму, которую я строю.

ПОЖАЛУЙСТА, СОВЕТУЙТЕ.

1 Ответ

2 голосов
/ 08 марта 2019

Так работает реагирующий администратор. Если вы хотите, чтобы глагол UPDATE dataProvider публиковал только поля изменений (и, вероятно, отправлял PATCH, а не POST), вы должны сделать это в dataProvider.

Я не уверен, что провайдер будет выглядеть плохо после изменения: все, что вам нужно сделать, это изменить глагол UPDATE. По умолчанию это выглядит (для простого провайдера отдыха):

            case UPDATE:
                url = `${apiUrl}/${resource}/${params.id}`;
                options.method = 'PUT';
                options.body = JSON.stringify(params.data);
                break;

Вам просто нужно обновить его так:

            case UPDATE:
                url = `${apiUrl}/${resource}/${params.id}`;
                options.method = 'PUT';
-               options.body = JSON.stringify(params.data);
+               options.body = JSON.stringify(diff(params.data, param.previousData));
                break;

Где diff можно записать как:

consy diff = (previous, current) => lodash.pickBy(current, (v, k) => previous[k] !== v);
...