Polarion技术问询:如何将JS变量值传入Velocity变量及日期变量问题
问题解答
1. JavaScript变量无法传入Velocity变量的核心原因
Velocity是服务器端模板引擎,页面渲染流程是先执行所有Velocity代码生成最终的HTML/JS内容,之后JavaScript才会在客户端浏览器中运行。两者处于完全分离的执行阶段,因此客户端的JS变量值无法回溯修改服务器端的Velocity变量——等JS开始运行时,Velocity已经完成了页面的渲染工作。
你提到的反向操作(Velocity变量传入JS)可行,是因为Velocity可以直接将变量值嵌入到生成的JS代码中,比如:
<script> var jsWorkItemCount = "$workItemCount"; </script>
2. 解决近7天工作项数量的需求
你遇到的$today变量不生效,是因为Velocity默认没有这个内置变量,需要通过日期工具类手动生成符合查询语法的日期范围。
具体实现方法(基于Velocity DateTool)
多数企业级平台会默认集成Velocity的DateTool工具类,直接用它生成日期范围即可:
#set($dateTool = $velocityToolbox.get("dateTool")) #set($today = $dateTool.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", $dateTool.now())) #set($sevenDaysAgo = $dateTool.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", $dateTool.addDays($dateTool.now(), -7))) #set($newSrFilter = $transaction.workItems.search.query("type:changerequest AND created:[$sevenDaysAgo TO $today]")) #set($workItemCount = $newSrFilter.size())
关键说明:
$dateTool.addDays($dateTool.now(), -7):直接计算出7天前的时间- 日期格式可根据你的工作项查询语法调整,比如不需要时分秒的话,改成
yyyy-MM-dd即可 - 最后通过
$newSrFilter.size()获取到近7天的工作项总数
3. 关于页面参数尝试的补充
你之前用$pageParameter.VARIABLE.value()的思路,本质还是服务器端的参数传递逻辑,无法解决客户端JS到Velocity的变量传递问题——页面参数是在请求发起阶段就确定的,和后续JS运行阶段完全无关。
内容的提问来源于stack exchange,提问作者Julien Llanes
相关产品推荐
相关产品推荐

