React-Admin |使用ReferenceField批量选择

时间:2018-09-17 06:30:05

标签: react-admin

在我们的应用程序中,我们尝试使用ReferenceField中的Datagrid创建/修改/删除相关记录,如https://marmelab.com/blog/2018/07/09/react-admin-tutorials-form-for-related-records.html

除最近的react-admin更新中添加的批量操作外,本教程中显示的所有功能都可以正常工作。点击这些复选框,将显示

  

未捕获的TypeError:_this.props.onToggleItem不是函数

我相信这是因为onToggleItem属性通常由List组件提供,但是在此应用程序中,Datagrid没有父List组件。

在ReferenceManyField和Datagrid之间添加一个List组件,可以在样式进行一些更改后进行批量选择/删除,但这会引起另一个问题:当前显示的页面(即记录1-10、11-20等)已​​存储商店中每种资源的情况,因此商店可能会说我们在第2页上,并显示第2页,这是空的,因为只有足够的相关项目来填充一页。

我在这里错过了什么吗?还是目前无法在ReferenceManyField内部进行批量选择?

export const NetworksShow = (props) => (
  <Show title={<NetworksTitle />} actions={<NetworksShowActions />} {...props}>

        <ReferenceManyField addLabel={false} target="ipid" reference="acl-network">
          <List style={{ margin: '0px -24px -16px -24px' }} {...props} actions={<NetworkACLCardActions ipid={props.id}/>} filter={{ ipid: _.has(props, 'id') ? props.id : undefined }}>
            <Datagrid hasBulkActions={true}>
              <ReferenceField label="Network" source="ipid" reference="networks">
                <TextField source="name" />
              </ReferenceField>
              <TextField label="URL" source="url" />
              <BWChip label="Action" source="wb" />
              <EditButton />
              <DeleteButton />
            </Datagrid>
          </List>
        </ReferenceManyField>
  </Show>
);

3 个答案:

答案 0 :(得分:1)

作为https://github.com/marmelab/react-admin/pull/2365的副作用,现在可以按照问题中所述的方式使用ReferenceManyField-> List-> Datagrid。

例如,我们现在正在执行以下操作:

      <ReferenceManyField addLabel={false} target="groupid" reference="users">
        <List
          style={{ margin: '0px -24px -16px -24px' }}
          filter={{ groupid: id }}
          {...props}
        >
          <Datagrid hasBulkActions>
            <LinkField label="Name" source="name" />
            <LinkField label="Username" source="email" />
            <FlexibleBooleanField label="Email" source="allowemail" />
            <ACLChip label="User Access" source="aclid" />
          </Datagrid>
        </List>
      </ReferenceManyField>

批量操作适用于上述操作,并且避免了任何分页问题,​​因为react-admin现在可以检查并修改分页,如果当前页面上没有任何内容。

答案 1 :(得分:0)

documentation中我了解到,Datagrid只是一个迭代器“哑组件”
它只是“显示”父级(通常是List(已连接的组件)),或者在您的情况下为ReferenceManyField-先前已获取的元素。 因此,我认为BulkActions仅在由List元素提供时才能起作用。

对于您的问题的第二部分,应该在最顶层使用列表,而不要在其他元素中使用列表,这就是为什么它会使您无法分页。

答案 2 :(得分:0)

我实现了“ DumbList”,它从父组件获取数据,而不是自身加载数据。解决了这个问题:

import React from 'react';
import { ListController } from 'ra-core';
import { ListView } from 'ra-ui-materialui/esm/list/List';

export const DumbList = props =>
  <ListController {...props}>
    {controllerProps => {
      let { data } = props
      const ids = Object.keys(data || {})
      const total = ids.length
      return <ListView
        {...props}
        // This is important, otherwise bulkActionsToolbar ends up on very top of the page
        classes={{ card: 'relative' }}
        {...Object.assign(controllerProps, { data, ids, total })} />
    }}
  </ListController>