概要
<#assign name1=value1 name2=value2 ... nameN=valueN>
或<#assign same as above... in namespacehash>
或<#assign name> capture this </#assign>
或<#assign name in namespacehash> capture this </#assign>
这里:
-
name
:变量的名字。 它不是表达式。而它可以写作是字符串,如果变量名包含保留字符这是很有用的, 比如<#assign "foo-bar" = 1>
。 请注意这个字符串没有展开插值(如"${foo}"
); 如果需要赋值一个动态创建的名字,那么不得不使用 这个技巧。 -
=
:赋值操作符。 它也可以是一个简写的赋值操作符(从 FreeMarker 2.3.23 版本开始):++
,--
,+=
,-=
,*=
,/=
或%=
。比如<#assign x++>
和<#assign x = x + 1>
是一样的,并且<#assign x += 2>
和<#assign x = x + 2>
是相同的。 请注意,++
通常意味着算术加法 (对于非数字将会失败),不像+
或+=
可以进行字符连接等重载操作。 -
value
: 存储的值。是表达式。 -
namespacehash
:(通过import
) 为命名空间创建的哈希表。是表达式。
描述
使用该指令你可以创建一个新的变量,
或者替换一个已经存在的变量。注意仅仅顶级变量可以被创建/替换
(也就是说你不能创建/替换 some_hash.subvar
,
除了 some_hash
)。
关于变量的更多内容,请阅读:模板开发指南/其它/在模板中定义变量
比如:变量 seq
存储一个序列:
<#assign seq = ["foo", "bar", "baz"]>
比如:变量 x
中存储增长的数字:
<#assign x++>
作为一个方便的特性,你可以使用一个 assign
标记来进行多次定义。比如这个会做上面两个例子中相同的事情:
<#assign seq = ["foo", "bar", "baz"] x++ >
如果你知道什么是命名空间:assign
指令在命名空间中创建变量。通常它在当前的命名空间
(也就是和标签所在模板关联的命名空间)中创建变量。但如果你是用了
in namespacehash
,
那么你可以用另外一个 命名空间 来创建/替换变量。
比如,这里你在命名空间中 /mylib.ftl
创建/替换了变量 bgColor
:
<#import "/mylib.ftl" as my> <#assign bgColor="red" in my>
assign
的极端使用是当它捕捉它的开始标记和结束标记中间生成的输出时。
也就是说,在标记之间打印的东西将不会在页面上显示,
但是会存储在变量中。比如:
<#macro myMacro>foo</#macro> <#assign x> <#list 1..3 as n> ${n} <@myMacro /> </#list> </#assign> Number of words: ${x?word_list?size} ${x}
将会输出:
Number of words: 6 1 foo 2 foo 3 foo
请注意,你不应该使用它来往字符串中插入变量:
<#assign x>Hello ${user}!</#assign> <#-- BAD PRACTICE! -->
你可以这么来写:
<#assign x="Hello ${user}!">