Activiti技术问询:如何在用户表单JS中遍历Groovy生成的Map变量
在Activiti用户表单中遍历Groovy创建的Map变量
别担心,刚接触Activiti遇到这种问题太正常了!我来一步步帮你搞定这个事儿。
首先得先解决核心问题:为什么你在流程模型里能引用tasks,但表单里直接用${tasks}却为空?因为你在Groovy脚本里创建的tasks一开始只是局部变量,没有被存入Activiti的流程实例变量池,前端表单根本拿不到它。所以第一步要先把这个Map变成流程变量:
1. 修正Groovy脚本,将Map存入流程变量
在你的Groovy代码末尾加上一行,把tasks设置为流程实例的全局变量:
Map<String,String> tasks = new HashMap<String,String>(); tasks.put("task 1","this is a new task"); tasks.put("task 2","this is another new task"); // 关键:把Map存入流程变量,让表单能访问到 execution.setVariable("tasks", tasks);
2. 在用户表单的JavaScript中遍历Map
现在tasks已经是流程变量了,接下来在表单的JS里就能获取并遍历它。Activiti的表单上下文提供了activitiForm对象来获取流程变量,你可以这么写:
// 从流程上下文获取tasks变量 var taskMap = activitiForm.getVariable("tasks"); // 先判断变量是否存在,避免报错 if (taskMap) { // 方法1:用Object.keys遍历键值对 Object.keys(taskMap).forEach(function(taskKey) { var taskDesc = taskMap[taskKey]; // 这里可以把内容渲染到页面上,比如追加到某个容器 var taskListElement = document.getElementById("taskList"); if (taskListElement) { taskListElement.innerHTML += `<div class="task-item">${taskKey}: ${taskDesc}</div>`; } // 也可以打印到控制台调试 console.log(`${taskKey} -> ${taskDesc}`); }); // 方法2:用for...in循环(注意要判断hasOwnProperty) // for (var key in taskMap) { // if (taskMap.hasOwnProperty(key)) { // var value = taskMap[key]; // // 你的处理逻辑 // } // } }
额外提示
- 如果之前的显示文本控件
${tasks}还是空,是因为Activiti表单的表达式解析对于复杂对象(比如Map)不会直接渲染成可读格式,用JS主动获取并渲染是更可靠的方式。 - 确保你的表单是绑定到对应的流程实例上,而且流程已经执行到了包含这个变量的节点,不然变量还没被创建出来。
内容的提问来源于stack exchange,提问作者Master Yoda
相关产品推荐
相关产品推荐

