On this page
assign
Page Contents
Synopsis
<#assign name1=value1 name2=value2 ... nameN=valueN>
or
<#assign same as above... in namespacehash>
or
<#assign name>
capture this
</#assign>
or
<#assign name in namespacehash>
capture this
</#assign>
Where:
name
:变量的名称。它不是表达。但是,它可以写为字符串 Literals,这在变量名包含保留字符(例如<#assign "foo-bar" = 1>
)时很有用。请注意,此字符串 Literals 不会扩展插值(如"${foo}"
);如果需要分配给动态构造的名称,则必须使用一个不同的把戏。请注意,由于 FreeMarker 模板语言假定序列(列表,数组等)和散列(Map,bean 等)是不可变的,因此您不能不能编写<#assign myObj.someProperty = 'will NOT work'>
或<#assign myList[0] = 'will NOT work'>
之类的东西。但是,支持使用+
运算符添加序列或哈希值以形成另一个值。请参见关于表达式的章节,请注意性能后果。=
:分配运算符。它也可以是赋值速记运算符之一(自 FreeMarker 2.3.23 起):++
,--
,+=
,-=
,*=
,/=
或%=
。就像<#assign x++>
与<#assign x = x + 1>
类似,而<#assign x += 2>
与<#assign x = x + 2>
相同。请注意,++
始终表示算术加法(因此,它将对非数字运算失败),与+
或+=
重载以进行字符串连接等不同。value
:要存储的值。表达。namespacehash
:为namespace(由import)创建的哈希。表达。如果未指定,则默认为属于包含模板的名称空间。
Description
这样,您可以创建一个新变量,或替换一个现有变量。请注意,只能创建/替换顶级变量(即,您不能创建/替换some_hash.subvar
,而不能创建/替换some_hash
)。
有关变量的更多信息,请阅读:模板作者指南/模板中的其他/定义变量
Note:
一个常见的错误是试图使用assign
来更改局部变量,例如:<#macro m><#local x = 1>${x}<#assign x = 2>${x}</#macro>
。这将打印11
而不是12
,因为assign
创建/替换了模板所属的命名空间的x
,并且不更改x
局部变量。局部变量应始终使用local directive设置,而不仅仅是在第一时间设置。
示例:变量seq
将存储一个序列:
<#assign seq = ["foo", "bar", "baz"]>
示例:增加存储在变量x
中的数值:
<#assign x++>
作为一项便利功能,您可以使用一个assign
标签进行更多分配。例如,这将与前面的两个示例相同:
<#assign
seq = ["foo", "bar", "baz"]
x++
>
如果您知道什么是名称空间:assign
指令在名称空间中创建变量。通常,它会在当前名称空间(即与与代码所在的模板相关联的名称空间)中创建变量。但是,如果使用in namespacehash
,则可以创建/替换当前名称空间之外的另一个namespace的变量。例如,在这里您创建/替换用于/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}
will print:
Number of words: 6
1 foo
2 foo
3 foo
请注意,您不应使用此函数将变量插入字符串:
<#assign x>Hello ${user}!</#assign> <#-- BAD PRACTICE! -->
您应该简单地写:
<#assign x="Hello ${user}!">