问题描述
在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响应是可以的,也许只有一个方法是不正确的。
为什么不将ArrayInput
与SimpleIterator
一起使用?它使您可以编辑嵌套记录内的所有字段,甚至在需要时使用ReferenceInputs
。
<ArrayInput source="tags">
<SimpleFormIterator>
<TextInput source="id" disabled />
<TextInput source="name" />
<TextInput source="description" />
</SimpleFormIterator>
</ArrayInput>