diff --git a/packages/devkit/lib/viewmodel/viewmodel-node.ts b/packages/devkit/lib/viewmodel/viewmodel-node.ts index 5f8a064c73497f8b62d65decb230e922d23a9c34..33833d1d75c95f53fa5e554fc064e16f94864b2f 100644 --- a/packages/devkit/lib/viewmodel/viewmodel-node.ts +++ b/packages/devkit/lib/viewmodel/viewmodel-node.ts @@ -1,6 +1,7 @@ /* eslint-disable no-use-before-define */ import { Injector, InjectFlags } from '../common/index'; import { Module } from '../module'; +import { ViewModel, ViewModelState } from './viewmodel'; /** * 视图模型树节点 @@ -55,11 +56,11 @@ class ViewModelNode { return this.injector; } - public getRoot() { - return this.root; + public getRoot(): ViewModel { + return this.root as ViewModel; } - public getParent() { - return this.parent; + public getParent(): ViewModel { + return this.parent as ViewModel; } /** * 获取所属Module diff --git a/packages/renderer/src/composition/use-navigation.ts b/packages/renderer/src/composition/use-navigation.ts index d3f4c99219e1ecc80c572cce16b3dc093348e882..61486985140ca93abda083ef96b29ba67d904631 100644 --- a/packages/renderer/src/composition/use-navigation.ts +++ b/packages/renderer/src/composition/use-navigation.ts @@ -7,13 +7,28 @@ export function useNavigation(injector: Injector) { const navigationEventService = injector.get(NavigationEventService); const formMetadata = useFormMetadataService(injector); const module = useModule(injector); + function resolveCommand(commandBinding: string): { commandName: string, commandViewModelId: string | null; } { + let commandViewModelId: string | null = null; + let commandName: string; + if (commandBinding.indexOf('.') !== -1) { + // 绑定其他视图模型命令:viewModelId.commandName + const commandBindingSegs = commandBinding.split('.'); + commandViewModelId = formMetadata.convertViewModelIdToComponentId(commandBindingSegs[commandBindingSegs.length - 2]); + commandName = commandBindingSegs[commandBindingSegs.length - 1]; + } else { + // 绑定当前视图模型命令:commandName + commandName = commandBinding; + } + return { commandName, commandViewModelId }; + } navigationEventService.addEventListener(TAB_EVENT.onTabRefresh, () => { const components = formMetadata.getComponents(); components.forEach((component: any) => { if (component.onInit) { - const viewModel: any = module.getViewModel(component.id); - viewModel[component.onInit](); + const { commandName, commandViewModelId } = resolveCommand(component.onInit); + const viewModel: any = module.getViewModel(commandViewModelId || component.id); + viewModel[commandName](); } }); }); diff --git a/packages/renderer/src/event-handler/end-edit-cell-event-handler.ts b/packages/renderer/src/event-handler/end-edit-cell-event-handler.ts index 88fbcdd4076864b21fabc356e1cd5e31dd23f4c7..3149946b2fb813cdea9c561656ac83c87cc02559 100644 --- a/packages/renderer/src/event-handler/end-edit-cell-event-handler.ts +++ b/packages/renderer/src/event-handler/end-edit-cell-event-handler.ts @@ -95,8 +95,8 @@ export class EndEditCellEventHandler implements EventHandler { } else { delete mappingFields[textField]; } - this.clearMappingValue(entityStore, mappingFields, bindingPaths, row); } + this.clearMappingValue(entityStore, mappingFields, bindingPaths, row); } private clearMappingValue(entityStore: EntityStore, mappingFields: Record, bindingPaths: string[], row: any) { this.mapping(entityStore, mappingFields, bindingPaths, row, null, undefined); diff --git a/packages/renderer/src/event-handler/lookup-clear-mapping-event-handler.ts b/packages/renderer/src/event-handler/lookup-clear-mapping-event-handler.ts index a0d2fb765c152be72c7cec23934d6df2b8f85b0f..719335400e2671b1dcc2cb604ab36796a41a5cd9 100644 --- a/packages/renderer/src/event-handler/lookup-clear-mapping-event-handler.ts +++ b/packages/renderer/src/event-handler/lookup-clear-mapping-event-handler.ts @@ -20,7 +20,7 @@ export class LookupClearMappingEventHandler implements EventHandler { const event: ViewEvent = payload; const { token, type, payloads } = event; const eventArgs = payloads[0] || {}; - const { isFreeInput, items } = eventArgs; + const { isFreeInput, items, mappingFields: componentMappingFields } = eventArgs; const component = this.formMetadataService.getMetadataById(token); if (!component) { return; @@ -29,7 +29,7 @@ export class LookupClearMappingEventHandler implements EventHandler { if (!fieldId) { return; } - const mappingFields = JSON.parse(component.editor?.mappingFields || component.editor?.mapFields || '{}'); + const mappingFields = componentMappingFields || {}; const { separator = ',', textField } = component.editor || {}; const { id } = component; const relatedComponent = this.formMetadataService.getRelatedComponent(id); @@ -66,9 +66,9 @@ export class LookupClearMappingEventHandler implements EventHandler { mappingFields[textField] = targetField; } else { delete mappingFields[textField]; - } - this.clearMappingValue(entityStore, mappingFields, bindingPaths, separator); + } } + this.clearMappingValue(entityStore, mappingFields, bindingPaths, separator); } private clearMappingValue(entityStore: EntityStore, mappingFields: Record, bindingPaths: string[], separator: string) { this.mapping(entityStore, mappingFields, bindingPaths, null, separator);