如何将Camunda服务任务结果传入表单及camForm.variableManager未定义问题咨询
问题修复与实现方案
1. camForm.variableManager返回undefined的根因
你在事件回调外部直接获取camForm.variableManager时,camForm实例还未完成初始化,变量管理器尚未挂载,所以返回undefined,所有变量操作都要放到对应的生命周期回调中执行。
2. 修正后的表单脚本
<script cam-script type="text/form-script"> var jobRequestInfo = $scope.jobRequestInfo = {}; // 表单加载完成后先声明要拉取的变量,避免默认只拉取表单直接绑定的变量 camForm.on('form-loaded', function() { camForm.variableManager.fetchVariable('a'); // 如果是多值服务结果变量,也在这里提前声明拉取 camForm.variableManager.fetchVariable('serviceResultList'); }); camForm.on('variables-fetched', function() { // 此时变量已拉取完成,可正常读取 const variableA = camForm.variableManager.variableValue('a'); console.log('变量a的值:', variableA); // 读取多值服务结果绑定到scope,供表单选择 $scope.serviceResultList = camForm.variableManager.variableValue('serviceResultList'); // 绑定用户选择的最优值变量 $scope.selectedBestValue = null; // 表单提交时把选中值写回流程变量 camForm.on('submit', function() { camForm.variableManager.variable('selectedBestValue', $scope.selectedBestValue); }); }); </script>
3. 跨池消息传递变量注意事项
你当前的消息关联表达式已经正确设置了变量a,只需确认两个点:
- 消息名称
changerequirement和池B的消息启动事件/消息接收事件的名称完全匹配 - 如果要传递多值服务结果,直接在
setVariable里传入数组/对象即可,Camunda支持自动序列化复杂类型为流程变量
${execution.getProcessEngineServices().getRuntimeService() .createMessageCorrelation("changerequirement") .setVariable("a", 1) // 示例:传递多值服务结果 .setVariable("serviceResultList", 执行服务返回的多值结果对象) .correlateWithResult()}
4. 最优值选择表单示例
在表单HTML部分添加选择组件,绑定scope变量即可实现用户选择能力:
<div class="form-group"> <label>请选择最优结果</label> <select class="form-control" ng-model="selectedBestValue" ng-options="item.value as item.desc for item in serviceResultList" required> <option value="">请选择</option> </select> </div>
内容的提问来源于stack exchange,提问作者RaRaIn
相关产品推荐
相关产品推荐

