我可以使用ReferenceArrayInput编辑对象列表而不仅仅是ID列表吗?

问题描述

react-admin中,我有一个要管理的项目,看起来有点像这样:

{
  "title": "Title of my record","source_id": "525560","source_timestamp": 1547732039,"tags": [
    {
      "id": 9,"name": "Tag0","description": "Descriptio of tag 0"
    },{
      "id": 10,"name": "Tag1","description": "Descriptio of tag 1"
    }
  ]
}

标签是作为主要项目内的对象列表提供的。

我希望能够对此进行管理,但是我在“编辑”视图中拥有的代码错误的:

export const IncidentEdit = props => {
    var _tag_ids = [1,2,3,4];
    return <Edit title={<IncidentTitle/>} {...props}>
        <SimpleForm>
            <TextInput fullWidth source="title"/>
            <TextField source="description"/>

            <ReferenceArrayInput label="tags" reference="tag" source="tags">
                <SelectArrayInput>
                    <ChipField source="name"/>
                </SelectArrayInput>
            </ReferenceArrayInput>

        </SimpleForm>
    </Edit>
};

这不起作用,因为ReferenceArrayInput期望record.tags标记外键的列表。它实际上是标签列表(因此我们实际上不必查找任何内容)。它也会失败,因为它返回的是一个外键列表-而API只是希望返回一个标记对象列表。

我们可能会争辩说API的设计不正确,但是React Admin可以适应吗?

在将它们提供给ReferenceArrayInput之前,是否有办法将这些记录转换为外键ID列表,然后在将它们发送回API之前进行相反的处理?或者,我可以更改API,使其仅返回外键,而不返回实际的标记对象。

解决方法

在这种情况下,您似乎不必获取其他数据。您的API响应是可以的,也许只有一个方法是不正确的。

为什么不将ArrayInputSimpleIterator一起使用?它使您可以编辑嵌套记录内的所有字段,甚至在需要时使用ReferenceInputs

<ArrayInput source="tags">
    <SimpleFormIterator>
        <TextInput source="id" disabled />
        <TextInput source="name" />
        <TextInput source="description" />
    </SimpleFormIterator>
</ArrayInput>