Skip to content

页面扩展 ​

可复用模块提供五类扩展点,宿主无需编辑包文件即可定制内置页面。普通生成业务页面自行定义列、控件和 CRUD 方法。

扩展点模块选项指南
表格列entityPropContributors表格列
新增字段createFormPropContributors表单字段
编辑字段editFormPropContributors表单字段
行操作entityActionContributors实体操作
工具栏toolbarActionContributors工具栏操作

从一个贡献者开始 ​

ts
import { EntityProp, PropType, EntityAction } from '@lsw-abpvue/components';
import { LocalizationService } from '@lsw-abpvue/core';
import { IdentityComponents, type IdentityConfigOptions } from '@lsw-abpvue/identity';
import type { IdentityUserDto } from '@lsw-abpvue/identity/proxy';
import { ToasterService } from '@lsw-abpvue/theme-shared';

export const identityOptions = {
  entityPropContributors: {
    [IdentityComponents.Users]: [
      props =>
        props.addTail(
          EntityProp.create<IdentityUserDto>({
            name: 'displayLabel',
            type: PropType.String,
            displayName: 'AbpIdentity::DisplayName:Name',
            valueResolver: data => data.record.name || data.record.userName || '',
          }),
        ),
    ],
  },
  entityActionContributors: {
    [IdentityComponents.Users]: [
      actions =>
        actions.addTail(
          EntityAction.create<IdentityUserDto>({
            text: 'AbpIdentity::UserName',
            action: data => {
              const localization = data.getInjected(LocalizationService);
              data.getInjected(ToasterService).info(
                {
                  key: 'BookStore::SelectedUser',
                  defaultValue: data.record.userName || '',
                },
                localization.t('AbpIdentity::Users'),
              );
            },
          }),
        ),
    ],
  },
} satisfies IdentityConfigOptions;

映射的 key 是准确的公共组件标识,例如 Identity.UsersComponent。贡献者收到可修改的链表并直接修改它,不需要返回新列表。将选项映射传给模块路由工厂,注册过程见用户教程。

定位已有项时,使用稳定的字段名或本地化 key;当前语言显示的文字不是稳定标识。

组装顺序与作用域 ​

  1. 模块加入默认项。
  2. 将受支持的后端对象扩展元数据映射为列与控件。
  3. 宿主贡献者添加、删除或替换条目。
  4. 在模块注入器下渲染页面。

进入路由时组装新列表。贡献者应描述最终修改,不要在贡献者内部继续注册贡献者。模块启动配置负责菜单,路由工厂负责页面扩展选项。

回调可能在 setup 之外执行。data.getInjected(Token) 从扩展所在的注入器解析服务;点击回调中直接调用普通 inject 无效。

操作链表 ​

ts
props.addAfter(customProp, prop => prop.name === 'userName');
props.dropByValue(prop => prop.name === 'email');
props.addByIndex(customProp, 2);

这里的 props 和 customProp 是贡献者中的类型化列表与属性。相对插入比数字位置更能适应上游变化。addAfter 未匹配时追加到末尾,addBefore 未匹配时插到开头。dropByValue 删除首个匹配,dropByValueAll 删除全部匹配。

扩展行为介绍回调上下文、链表操作与运行时默认值。

行与工具栏上下文 ​

EntityAction<IdentityUserDto> 的 data.record 是单行记录。ToolbarAction<readonly IdentityUserDto[]> 收到当前页记录,不是勾选行,也不是数据库全部记录。普通业务页面中的 RowAction<R> 直接收到 R。

valueResolver 支持值、Promise、Ref 和 getter,结果作为文本显示。富单元格使用 Vue 组件,接收 record、index、prop、value。表单自定义组件使用另一套模型契约,见表单字段。

保留后端行为 ​

扩展字段使用 isExtra: true,且需要后端真实声明该扩展属性。添加前端字段不会自动创建后端存储。权限和显隐条件只控制 UI,服务端仍须授权 API。

贡献者修改配置项;完整组件替换负责自身 UI 与命令。组件替换介绍保留内置页面行为的包装方式。

非官方社区项目,采用 MIT 许可证,与 Volosoft 无关。