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:

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}!">
上一章 首页 下一章