velocity - 如何将`#evaluate`的结果分配给变量?
问题描述
语境:
在 XWiki 站点中,我大量使用速度模板来表示对象的特定表示。在特定模板中,我需要能够具有一个间接级别以允许对某些字段进行特殊处理。我设法将公式放入变量中并在渲染时对其进行评估。
我当前的(简化的)代码是:
#set($special = { 'field1': 'F1: $pageDoc.display("field1") - F2: $pageDoc.display("field2")',
'field2': '' }
...
#foreach($field in $fields):
#if($special.contains($field))
#if("$special[$field]" != "")
<p>#evaluate($special[$field])</p>
#end
#else
<p>$pageDoc.display($field)</p>
#end
#end
事实上,这个示例代码在一行中显示一个字段列表,而其中一些(特殊字段)连续显示 2 个($pageDoc.display($field)
是一个 XWiki 习惯用法,用于显示从页面中包含的对象获取可显示的值)
问题:
对于不同的渲染引擎,我现在需要将这些行传递给引擎:
$engine.addLine($pageDoc.display($field))
但是$engine.addLine(#evaluate($special[$field]))
不能工作,因为#evaluate
直接输出它的评估并且不返回任何东西。
问题
速度有没有办法将结果存储#evaluate
在变量中?
解决方案
在速度中,#evaluate
仅执行其内容。观察到所有副作用,主要是输出,但什么都不能返回。
诀窍的(第一部分)是必须#evaluate
评估 a #set
,例如(注意这个是不正确的):
#evaluate(#set($resul = $special[$field]))
$engine.addLine($resul)
如果要在评估的字符串中转义特殊字符的问题,因为第一部分不应评估,而第二部分应评估,并且该速度具有相当奇怪的转义规则:#
and$
应使用 进行转义\
,而'
and"
应加倍。 ..
对于第二部分,它只是给出:
#evaluate("\#set(\$resul= ""$special[$field]"")")
$engine.addLine($resul)
推荐阅读
- postgresql - 如何使用验证批量导入并使用 paper_trail 创建版本?
- javascript - JavaScript中从当前日期到分钟的时间差
- javascript - 移动响应式菜单放置
- postgresql - 具有 UNIQUE 约束的重复记录
- amazon-web-services - 如何使用不同的环境变量在 AWS ECS 上安排多个任务?
- ansible - 如何根据变量中定义的主机名在多个主机中执行任务
- spring-webflux - Spring Webflux 使用 DataBuffer 将 WebClient.exchange() 迁移到 WebClient.exchangeToMono()
- mechanicalturk - 创建包含 Mturk“workerId”但在 Turkprime(Cloudresearch)中称为“participant_label”的外部链接
- python - 连续说出 nsfw 单词 3 次后如何使不和谐机器人静音用户
- c# - 谁在显示 ContextMenu:表单还是通知图标?