reactjs - 使用 admin-on-rest 添加嵌套资源

标签 reactjs admin-on-rest

我正在使用 admin-on-rest。多么棒的框架啊!它对于我的扁平资源运行得很好。

我正在检索项目列表 /projects。我已经实现了一个 ProjectEdit View 来编辑给定的项目 /projects/:id

export const ProjectEdit = props => {
    const projectId = props.match.params.id;

    return (
        <Edit title={<ProjectTitle />} {...props}>
            <TabbedForm>
                <FormTab label="Project">
                    <DisabledInput source="id" />
                    <TextInput source="name" />
                </FormTab>
                <FormTab label="Companies">
                    // WHAT Should I put here to edit my companies list ???
                </FormTab>
            </TabbedForm>
        </Edit>
    );
};

我想实现一个新选项卡,通过它我可以在项目中添加/删除公司。

获取/projects/:id/companies

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 2,
            "name": "My Company"
        }
    ]
}

POST /projects/:id/companies

删除/projects/:id/companies/:company_id

我尝试使用 ReferenceManyField 但无法配置它,因为我的 API 需要自定义 GET。我的项目没有任何公司引用。我找不到任何有关如何执行它的示例。

请问有什么线索吗? :)

<小时/>

编辑1:我可以使用 @malisbad answer 显示我的项目公司列表。但我仍然无法显示它的版本(例如:使用 ReferenceArrayInput + SelectArrayInput)

最佳答案

您必须使用自定义的restClient。我也遇到了同样的问题,所以如果您还没有,请创建它。

然后查看数据如何到达您想要为其提供子资源的每个方法,并修改 URL 并请求从那里触发。

例如,在 GET_MANY_REFERENCE 中,我的 target 包含一个 ENUM,指定我正在查找子资源。

let url = `${apiUrl}/${resource}`;
case GET_MANY_REFERENCE: {
    let target;
    try {
      target = JSON.parse(params.target);
    } catch (err) {
      target = {};
    }

    /*
      Reference fields do not support the format of
      /<resource>/<resource id>/<subresource> so the target parameter is used
      to instead indicate the subresource call. See
      https://marmelab.com/admin-on-rest/Fields.html#referencefield
      for details on reference fields
    */
    if (target && target[ENUMS.SUBRESOURCE_IDENTIFIER]) {

      /*
        If a resource ID is present, it's because the base resource doesn't match the
        host resource and needs to use its own ID, not the host resource ID.
      */
      if (target[ENUMS.RESOURCE_ID]) {
        url = `${url}/${target[ENUMS.RESOURCE_ID]}/${target.subresource}`;
      } else {
        url = `${url}/${params.id}/${target.subresource}`;
      }
    }

然后您可以将其扩展到 REST 客户端的其他部分

关于reactjs - 使用 admin-on-rest 添加嵌套资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47348231/

相关文章:

javascript - 在js中观察localstorage的变化

html - 哪种文档结构更好?

admin-on-rest - 如何在 admin-on-rest 中创建可搜索的添加引用按钮/操作?

admin-on-rest - ReferenceManyField 在handleFetch 处未捕获 TypeError : payload. data.map 不是函数

redux-form - 影响 admin-on-rest 中 CustomField 的整个记录​​值

reactjs - 未满足的对等依赖性react-router@3.0.0

javascript - NPM 找不到模块 'safe-buffer'

javascript - Reactjs组件的异步渲染

javascript - 如何在 Admin-on-rest 中设置 SimpleList 以在触摸项目时在移动 View 中显示“显示表单”?

admin-on-rest - TabbedShowLayout/TabbedForm 中的条件 Tab/FormTab 渲染