我们需要3个不同的菜单项对同一资源(“资产”)执行CRUD操作,但所有 CRUD操作只有category_id
不同(直到你再按一次不同的菜单项。)
为了做到这一点,我们引入了一个名为kind
的查询参数,这是这三个链接中唯一的实际区别:
<MenuItemLink
to={{
pathname: '/assets',
search: stringify({page: 1, perPage: 25}),
}}
primaryText="Assets"
onClick={onMenuTap}
leftIcon={<AssetsIcon />}
/>
<MenuItemLink
to={{
pathname: '/assets',
search: stringify({
page: 1,
perPage: 25,
kind: 'printers'
}),
}}
primaryText="Printers"
onClick={onMenuTap}
leftIcon={<AssetsIcon />}
/>
<MenuItemLink
to={{
pathname: '/assets',
search: stringify({
page: 1,
perPage: 25,
kind: 'vehicles'
}),
}}
primaryText="Vehicles"
onClick={onMenuTap}
leftIcon={<AssetsIcon />}
/>
通过以下代码,List仅为这些资产提取记录:
//注意:'parsedKind'是使用以前的代码解析grom查询参数,它获取以下值之一:''OR'打印机'或'车辆'
<List
title={<TitleList location={props.location} />}
{...props}
filters={<AssetFilter location={props.location} key={parsedKind} />}
perPage={15}
filter={{cat_id: dbIds[parsedKind]}}
sort={{field: 'name', order: 'ASC'}}
actions={<OurCustomListActions parsedKind={parsedKind} {...props} />}
key={parsedKind}
>
为了实现这一点,我们必须使用自定义按钮自定义“操作”,以便parsedKind
跟进。例如,CreateButton
现在需要道具ourQuery
:
<FlatButton
primary
label={label && translate(label)}
icon={<ContentAdd />}
containerElement={<Link to={`${basePath}/create?${ourQuery}`} />}
style={styles.flat}
/>
我在这里有3个问题:
这是一项繁琐的工作(所有按钮都已定制),我想知道是否有其他解决方案可以满足这一需求。
仍然,“SaveButton”会导致头痛,因为它使用来自handleSubmitWithRedirect
的{{1}}函数,参数只是视图的名称(例如'list') 。那么如何在最终的URL上添加查询参数呢?我在2秒后使用了一个丑陋的props
(setTimeout
),但显然这是非常错误的。 window.location.hash = window.location.hash + '?' + this.props.ourQuery;
也存在问题,因为它会重定向到子视图。
使用上述方法,我在List分页中得到DeleteButton
。为什么?这也能以某种方式解决吗?
谢谢!
答案 0 :(得分:1)
因此,我认为您最好的选择就是创建三种资源:Assets
,Vehicles
和Printers
。
在restClient / dataProvider中,创建逻辑以使用正确的assets
将这三个资源路由到parameter
端点。我简单的中间件就足够了,就行了:
// MyAssetResourceMiddleware.js
export default restClient => (type, resource, params) => {
switch(resource){
case 'Assets':
case 'Vehicles':
case 'Printers':
return restClient(type,'assets',{...params,kind:resource});
default:
return restClient(type,resource,params);
}
}
用你的提供者包装
<Admin dataProvider={MyAssetResourceMiddleware(dataProvider)} .../>