From 58f2a943b866a836817b12b93194eb0e13f82d16 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 1 Sep 2026 15:11:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(editor):=20inject=20eventBus=20=E6=97=B6?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=20null=20=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 避免未处于 Editor 子树时 Vue 报 injection "eventBus" not found。 --- packages/editor/src/fields/CodeSelectCol.vue | 2 +- .../src/fields/DataSourceFieldSelect/FieldSelect.vue | 2 +- packages/editor/src/fields/DataSourceMethodSelect.vue | 2 +- packages/editor/src/fields/DataSourceSelect.vue | 2 +- .../layouts/sidebar/code-block/CodeBlockListPanel.vue | 2 +- .../src/layouts/sidebar/code-block/useContentMenu.ts | 2 +- .../layouts/sidebar/data-source/DataSourceListPanel.vue | 2 +- .../src/layouts/sidebar/data-source/useContentMenu.ts | 2 +- .../editor/tests/unit/fields/DataSourceSelect.spec.ts | 9 +++++++++ 9 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/editor/src/fields/CodeSelectCol.vue b/packages/editor/src/fields/CodeSelectCol.vue index dcee5fff..9540f070 100644 --- a/packages/editor/src/fields/CodeSelectCol.vue +++ b/packages/editor/src/fields/CodeSelectCol.vue @@ -84,7 +84,7 @@ defineOptions({ const mForm = inject('mForm'); const { codeBlockService, uiService } = useServices(); -const eventBus = inject('eventBus'); +const eventBus = inject('eventBus', null); const emit = defineEmits<{ change: [v: any, eventData: ContainerChangeEventData]; }>(); diff --git a/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue b/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue index 342db0a8..6147d8dc 100644 --- a/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue +++ b/packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue @@ -124,7 +124,7 @@ const optionComponent = getDesignConfig('components')?.option; const { dataSourceService, uiService } = useServices(); const mForm = inject('mForm'); -const eventBus = inject('eventBus'); +const eventBus = inject('eventBus', null); const allDataSources = computed(() => dataSourceService.get('dataSources') || []); diff --git a/packages/editor/src/fields/DataSourceMethodSelect.vue b/packages/editor/src/fields/DataSourceMethodSelect.vue index aabfe0be..e44aa41c 100644 --- a/packages/editor/src/fields/DataSourceMethodSelect.vue +++ b/packages/editor/src/fields/DataSourceMethodSelect.vue @@ -67,7 +67,7 @@ defineOptions({ const { dataSourceService, uiService } = useServices(); const mForm = inject('mForm'); -const eventBus = inject('eventBus'); +const eventBus = inject('eventBus', null); const emit = defineEmits(['change']); diff --git a/packages/editor/src/fields/DataSourceSelect.vue b/packages/editor/src/fields/DataSourceSelect.vue index f0bc95ae..bab8a3dd 100644 --- a/packages/editor/src/fields/DataSourceSelect.vue +++ b/packages/editor/src/fields/DataSourceSelect.vue @@ -50,7 +50,7 @@ const props = withDefaults(defineProps>(), { const mForm = inject('mForm'); const { dataSourceService, uiService } = useServices(); -const eventBus = inject('eventBus'); +const eventBus = inject('eventBus', null); const dataSources = computed(() => dataSourceService.get('dataSources')); diff --git a/packages/editor/src/layouts/sidebar/code-block/CodeBlockListPanel.vue b/packages/editor/src/layouts/sidebar/code-block/CodeBlockListPanel.vue index 27cdb60b..3dce75f7 100644 --- a/packages/editor/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +++ b/packages/editor/src/layouts/sidebar/code-block/CodeBlockListPanel.vue @@ -82,7 +82,7 @@ const props = defineProps<{ customContentMenu: CustomContentMenuFunction; }>(); -const eventBus = inject('eventBus'); +const eventBus = inject('eventBus', null); const { codeBlockService } = useServices(); diff --git a/packages/editor/src/layouts/sidebar/code-block/useContentMenu.ts b/packages/editor/src/layouts/sidebar/code-block/useContentMenu.ts index c0eed424..e984f153 100644 --- a/packages/editor/src/layouts/sidebar/code-block/useContentMenu.ts +++ b/packages/editor/src/layouts/sidebar/code-block/useContentMenu.ts @@ -6,7 +6,7 @@ import ContentMenu from '@editor/components/ContentMenu.vue'; import type { ContentMenuTarget, EventBus, MenuButton, MenuComponent, TreeNodeData } from '@editor/type'; export const useContentMenu = (deleteCode: (id: string) => void) => { - const eventBus = inject('eventBus'); + const eventBus = inject('eventBus', null); const menuRef = useTemplateRef>('menu'); let selectId = ''; diff --git a/packages/editor/src/layouts/sidebar/data-source/DataSourceListPanel.vue b/packages/editor/src/layouts/sidebar/data-source/DataSourceListPanel.vue index b04964ce..1b2115b8 100644 --- a/packages/editor/src/layouts/sidebar/data-source/DataSourceListPanel.vue +++ b/packages/editor/src/layouts/sidebar/data-source/DataSourceListPanel.vue @@ -75,7 +75,7 @@ const props = defineProps<{ customContentMenu: CustomContentMenuFunction; }>(); -const eventBus = inject('eventBus'); +const eventBus = inject('eventBus', null); const { dataSourceService } = useServices(); const { editDialog, dataSourceValues, dialogTitle, editable, editHandler, submitDataSourceHandler } = diff --git a/packages/editor/src/layouts/sidebar/data-source/useContentMenu.ts b/packages/editor/src/layouts/sidebar/data-source/useContentMenu.ts index 5c1c650e..02d8c4e8 100644 --- a/packages/editor/src/layouts/sidebar/data-source/useContentMenu.ts +++ b/packages/editor/src/layouts/sidebar/data-source/useContentMenu.ts @@ -6,7 +6,7 @@ import ContentMenu from '@editor/components/ContentMenu.vue'; import type { ContentMenuTarget, EventBus, MenuButton, MenuComponent, TreeNodeData } from '@editor/type'; export const useContentMenu = () => { - const eventBus = inject('eventBus'); + const eventBus = inject('eventBus', null); const menuRef = useTemplateRef>('menu'); let selectId = ''; diff --git a/packages/editor/tests/unit/fields/DataSourceSelect.spec.ts b/packages/editor/tests/unit/fields/DataSourceSelect.spec.ts index 93b0be0d..87864d9e 100644 --- a/packages/editor/tests/unit/fields/DataSourceSelect.spec.ts +++ b/packages/editor/tests/unit/fields/DataSourceSelect.spec.ts @@ -119,6 +119,15 @@ describe('DataSourceSelect', () => { }); }); + test('未 provide eventBus 时不告警,点击编辑也不抛错', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); + dataSourceService.getDataSourceById.mockReturnValue({ id: '1' }); + const wrapper = mount(DataSourceSelect, { props: baseProps({ model: { ds: '1' } }) as any }); + expect(warn.mock.calls.some((c) => String(c[0]).includes('eventBus'))).toBe(false); + await expect(wrapper.find('button').trigger('click')).resolves.toBeUndefined(); + warn.mockRestore(); + }); + test('editHandler emit edit-data-source', async () => { const eventBus = { emit: vi.fn() }; dataSourceService.getDataSourceById.mockReturnValue({ id: '1' });