freemarker中local和assign標籤區別

local

概要

<#local name=value>
或
<#local name1=value1 name2=value2 ... nameN=valueN>
或
<#local name>
  capture this
</#local>

  • name: 在root中局部對象的名稱。它不是一個表達式。但它可以被寫作是字符串形式, 如果變量名包含保留字符,這是很有用的,比如 <#local “foo-bar” = 1>。 請注意,這個字符串沒有擴展插值(如"${foo}")
  • =:賦值操作符,也可以簡寫的賦值操作符之一 (++,+= 等…),和 the assign 指令 相似。
  • value: 存儲的值,是表達式。

它和 assign 指令 類似,但是它創建或替換局部變量。 這僅僅在宏和方法的內部定義纔會有作用。要獲得更多關於變量的信息,可以閱讀:模板開發指南/其它/在模板中定義變量

assign

概要

<#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)

assign應用:
1.變量 seq 存儲一個序列

<#assign seq = ["foo", "bar", "baz"]>

2.變量 x 中存儲增長的數字

<#assign x++>

3.作爲一個方便的特性,你可以使用一個 assign 標記來進行多次定義。
比如這個會做上面兩個例子中相同的事情

<#assign
  seq = ["foo", "bar", "baz"]
  x++
>

4.assign 指令在命名空間中創建變量。
通常它在當前的命名空間 (也就是和標籤所在模板關聯的命名空間)中創建變量。
但如果你是用了 in namespacehash,
那麼你可以用另外一個 命名空間 來創建/替換變量。
比如,這裏你在命名空間中 /mylib.ftl 創建/替換了變量 bgColor

<#import "/mylib.ftl" as my>
<#assign bgColor="red" in my>

5.assign 的極端使用是當它捕捉它的開始標記和結束標記中間生成的輸出時。
也就是說,在標記之間打印的東西將不會在頁面上顯示, 但是會存儲在變量中

<#macro myMacro>foo</#macro>
<#assign x>
  <#list 1..3 as n>
    ${n} <@myMacro />
  </#list>
</#assign>
Number of words: ${x?word_list?size}
${x}
請注意,你不應該使用它來往字符串中插入變量:

<#assign x>Hello ${user}!</#assign> <#-- BAD PRACTICE! -->

你可以這麼來寫:

<#assign x="Hello ${user}!">
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章