Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions packages/amis-core/src/actions/Action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,23 @@ const getOmitActionProp = (type: string) => {
return omitList;
};

export const getTargetComponent = (
action: ListenerAction,
renderer: ListenerContext,
event: RendererEvent<any>,
key?: string
) => {
let targetComponent = renderer;
if (key && event.context.scoped) {
const func = action.componentId ? 'getComponentById' : 'getComponentByName';
if (typeof event.context.scoped[func] === 'function') {
targetComponent = event.context.scoped[func](key);
}
}

return targetComponent;
};

export const runActions = async (
actions: ListenerAction | ListenerAction[],
renderer: ListenerContext,
Expand Down Expand Up @@ -297,11 +314,7 @@ export const runAction = async (
delete action.args?.messages;
}
const cmptFlag = key.componentId || key.componentName;
let targetComponent = cmptFlag
? event.context.scoped?.[
action.componentId ? 'getComponentById' : 'getComponentByName'
](cmptFlag)
: renderer;
const targetComponent = getTargetComponent(action, renderer, event, cmptFlag);
// 动作配置
const args = dataMapping(action.args, mergeData, (key: string) => {
const curCmptType: string = targetComponent?.props?.type;
Expand Down
9 changes: 3 additions & 6 deletions packages/amis-core/src/actions/CmptAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import {
RendererAction,
ListenerAction,
ListenerContext,
registerAction
registerAction,
getTargetComponent
} from './Action';
import {getRendererByName} from '../factory';

Expand Down Expand Up @@ -58,11 +59,7 @@ export class CmptAction implements RendererAction {
}

// 如果key没指定,则默认是当前组件
let component = key
? event.context.scoped?.[
action.componentId ? 'getComponentById' : 'getComponentByName'
](key)
: renderer;
const component = getTargetComponent(action, renderer, event, key);
// 如果key指定了,但是没找到组件,则报错
if (key && !component) {
const msg = `尝试执行一个不存在的目标组件动作(${key}),请检查目标组件非隐藏状态,且正确指定了componentId或componentName`;
Expand Down
Loading