diff --git a/framework/elsa/fit-elsa-react/src/components/base/references.js b/framework/elsa/fit-elsa-react/src/components/base/references.js index 3fcf39b2f..713e7deb1 100644 --- a/framework/elsa/fit-elsa-react/src/components/base/references.js +++ b/framework/elsa/fit-elsa-react/src/components/base/references.js @@ -91,6 +91,8 @@ export const referenceDecorate = (node) => { if (type !== null && type !== undefined) { observable.type = type; } + + node.page.notifySubNodeObserver(node.id, observableId); }; /** diff --git a/framework/elsa/fit-elsa-react/src/components/common/JadeObservableOutput.jsx b/framework/elsa/fit-elsa-react/src/components/common/JadeObservableOutput.jsx index cf6acc0e0..5b6d19fd7 100644 --- a/framework/elsa/fit-elsa-react/src/components/common/JadeObservableOutput.jsx +++ b/framework/elsa/fit-elsa-react/src/components/common/JadeObservableOutput.jsx @@ -405,7 +405,7 @@ TreeNode.propTypes = { form: PropTypes.object, shape: PropTypes.object, showDescription: PropTypes.bool, - treeData: PropTypes.object, + treeData: PropTypes.array, output: PropTypes.object, }; diff --git a/framework/elsa/fit-elsa-react/src/flow/jadeFlowPage.js b/framework/elsa/fit-elsa-react/src/flow/jadeFlowPage.js index f9ac8a49a..05c744bd8 100644 --- a/framework/elsa/fit-elsa-react/src/flow/jadeFlowPage.js +++ b/framework/elsa/fit-elsa-react/src/flow/jadeFlowPage.js @@ -5,7 +5,7 @@ *--------------------------------------------------------------------------------------------*/ import {copyPasteHelper, ElsaCopyHandler, page, PAGE_OPERATION_MODE, shapeDataHelper, sleep, uuid} from '@fit-elsa/elsa-core'; -import {SYSTEM_ACTION, VIRTUAL_CONTEXT_NODE} from '@/common/Consts.js'; +import {OBSERVER_STATUS, SYSTEM_ACTION, VIRTUAL_CONTEXT_NODE} from '@/common/Consts.js'; import {conditionRunner, inactiveNodeRunner, standardRunner} from '@/flow/runners.js'; import {message} from 'antd'; @@ -151,6 +151,17 @@ export const jadeFlowPage = (div, graph, name, id) => { return self.observableStore.getObservable(nodeId, observableId); }; + /** + * 通知该节点所有树上子节点的observable. + * + * @param nodeId 所属节点的id. + * @param notifyTreeNodeId 通知的树上的id. + * @return {*|null} + */ + self.notifySubNodeObserver = (nodeId, notifyTreeNodeId) => { + return self.observableStore.notifySubNodeObserver(nodeId, notifyTreeNodeId); + }; + /** * 清空时,同时清空observableStore. * @@ -828,6 +839,47 @@ const ObservableStore = () => { return observableMap ? observableMap.get(observableId) : null; }; + /** + * 通知节点上所有对应的子节点. + * + * @param nodeId 被监听节点的id. + * @param notifyTopTreeNodeId 通知的子节点对应的顶层父节点的id. + * @return {*|null} + */ + self.notifySubNodeObserver = (nodeId, notifyTopTreeNodeId) => { + const observableMap = self.store.get(nodeId); + const adjacencyList = buildAdjacencyList(observableMap); + + const queue = adjacencyList.get(notifyTopTreeNodeId) || []; + + while (queue.length > 0) { + const currentObservable = queue.shift(); + + currentObservable.observers.forEach(o => { + if (o.status === OBSERVER_STATUS.ENABLE) { + o.notify({ + value: currentObservable.value, + type: currentObservable.type + }); + } + }); + + const children = adjacencyList.get(currentObservable.observableId) || []; + queue.push(...children); + } + }; + + const buildAdjacencyList = (observableMap) => { + const adjacencyList = new Map(); + for (const observable of observableMap.values()) { + if (!adjacencyList.has(observable.parentId)) { + adjacencyList.set(observable.parentId, []); + } + adjacencyList.get(observable.parentId).push(observable); + } + return adjacencyList; + }; + /** * 清空. */