You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:46:02