如何使用对象的 属性 作为 admin-on-rest 中的源?
How to use the property of an object as a source in the admin-on-rest?
我的朋友们。
我想添加一个与其他资源关联的字段,如下所示:https://marmelab.com/admin-on-rest/Tutorial.html#relationships
但我的问题是对象中包含其他资源 ID 的字段:
{
"id": 1,
....,
user: {
id: "12313123"
}
}
遇到这种情况我该怎么办?我已经知道我可以创建自己的 "Filelds",但是如何创建自己的 "ReferenceField"?我需要 "source" 属性 包含这样的内容:
<ReferenceField label="User" source="user.id" reference="users">
<TextField source="name" />
</ReferenceField>
我不太熟悉 admin-on-rest
框架,但从文档看来您可能 create a custom TextField relatively simply。也许您可以做类似的事情来创建自定义 ReferenceField。
import get from 'lodash.get'; // for safe access of nested data
const PostUserField = ({record}) => {
// "record" is the post object in this example
return (
<ReferenceField label="User" source={ get('user.id', record) } reference="users">
<TextField source="name" />
</ReferenceField>
);
}
然后像
那样称呼它
// inside your other component..
<PostUserField />
如果这不起作用,我会尝试看看您是否可以覆盖自定义组件中的 record
属性,以便不再嵌套访问。在这种情况下,id
将指向与之前 user.id
相同的 属性。
const PostUserField = ({record}) => {
// "record" is the post object in this example
// Prepare the record for the reference field, by removing
// the nesting
const unnestedUser = record.user;
return (
<ReferenceField record={ unnestedUser } label="User" source="id" reference="users">
<TextField source="name" />
</ReferenceField>
);
}
实际上,现在我又看了一遍这个问题..你确定你甚至需要一个 ReferenceField
来通过 id (user.id) 获取用户吗?因为您的 post 似乎已经有了用户数据。那么您可以使用自定义 TextField 来解决它,例如:
import get from 'lodash.get';
// "record" is still a Post object. But since the data is already on
// the Post object (in user.name) , we can print it directly
const PostUserName = ({record }) => <span>{get(record, 'user.name')}</span>;
很简单。它确实像source="user.id"一样工作,但是当我提出这个问题时我只是认为这是不可能的,所以它像我认为它必须工作一样工作)))
我的朋友们。 我想添加一个与其他资源关联的字段,如下所示:https://marmelab.com/admin-on-rest/Tutorial.html#relationships
但我的问题是对象中包含其他资源 ID 的字段:
{
"id": 1,
....,
user: {
id: "12313123"
}
}
遇到这种情况我该怎么办?我已经知道我可以创建自己的 "Filelds",但是如何创建自己的 "ReferenceField"?我需要 "source" 属性 包含这样的内容:
<ReferenceField label="User" source="user.id" reference="users">
<TextField source="name" />
</ReferenceField>
我不太熟悉 admin-on-rest
框架,但从文档看来您可能 create a custom TextField relatively simply。也许您可以做类似的事情来创建自定义 ReferenceField。
import get from 'lodash.get'; // for safe access of nested data
const PostUserField = ({record}) => {
// "record" is the post object in this example
return (
<ReferenceField label="User" source={ get('user.id', record) } reference="users">
<TextField source="name" />
</ReferenceField>
);
}
然后像
那样称呼它// inside your other component..
<PostUserField />
如果这不起作用,我会尝试看看您是否可以覆盖自定义组件中的 record
属性,以便不再嵌套访问。在这种情况下,id
将指向与之前 user.id
相同的 属性。
const PostUserField = ({record}) => {
// "record" is the post object in this example
// Prepare the record for the reference field, by removing
// the nesting
const unnestedUser = record.user;
return (
<ReferenceField record={ unnestedUser } label="User" source="id" reference="users">
<TextField source="name" />
</ReferenceField>
);
}
实际上,现在我又看了一遍这个问题..你确定你甚至需要一个 ReferenceField
来通过 id (user.id) 获取用户吗?因为您的 post 似乎已经有了用户数据。那么您可以使用自定义 TextField 来解决它,例如:
import get from 'lodash.get';
// "record" is still a Post object. But since the data is already on
// the Post object (in user.name) , we can print it directly
const PostUserName = ({record }) => <span>{get(record, 'user.name')}</span>;
很简单。它确实像source="user.id"一样工作,但是当我提出这个问题时我只是认为这是不可能的,所以它像我认为它必须工作一样工作)))