无法修改Soy模板中的值

时间:2014-05-19 06:50:10

标签: google-closure google-closure-templates

{let $first: 10 /} // this is a single line soy comment
  {if $first > 5 }
  {$first}<br/>
  {let $first:$first-1 /}
  {/if}
{$first}

我尝试了这个,打印出来:10 10

理想情况下,它应该打印:10 9 ..

请问您的代码中有什么错误吗?

1 个答案:

答案 0 :(得分:3)

首先,您无法真正覆盖$first的值。由let定义的documentation个状态局部变量不可修改。这是因为无论何时使用let对值进行别名,都会在已编译的输出中创建一个新变量。此外,大豆表达式的范围规则与Javascript中的不同(但您可以认为{let}具有与ECMAScript 6的let语句类似的语义,即非提升,块范围)。

在您的代码中:

{let $first: 10 /}           /* 1 */
{if $first > 5}
  {$first}<br/>
  {let $first¹: $first-1 /}  /* 2 */
                             /* 3 */
{/if}
{$first}                     /* 4 */

发生的事情是:

  • 在(1)中,$first是值10的别名。引入变量来保存此值。

  • 在(2)中:

    右手: $first从(1)获取其值,因为它是在父块中定义的。

    左手: $first¹被归结为$first - 1 = 10 - 1 = 9产生的值。因为$first的定义可以不被覆盖,引入了一个新的变量,与(1)不同。有两点需要注意:

    一个。 $first¹的值为9,但在此代码段中永远不会读取。

    $first¹仅在其定义的块内“生活”,即在{if...}内。事实上,如果您要在(3)中插入{$first},它将输出9。

  • 在(4)中,$first¹的值不在{if}块引入的范围之内,因此$first来自({1}} )是唯一一个可见的,产生10个。它在编译输出中使用与(1)相同的变量。