【问题标题】:How can I push a variable on the value stack in freemarker如何在 freemarker 的值堆栈上推送变量
【发布时间】:2011-04-01 04:30:33
【问题描述】:

在 freemarker 中,我希望在另一个模板中重复包含现有模板。现有模板假定它正在查看值堆栈的顶部。我真的在寻找“应用”功能。所以我有一个父模板:

<#list items as item>
<#include "/my/subtemplate.ftl"/>
</#list>

如何使子模板将项目视为值堆栈上的顶部项目,这样我就不需要复制它并将项目上对“属性”的每个引用更改为 item.myproperty?

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    只是确认“stack”是对 Struts2 框架放置在模板上下文中的 ValueStack 对象的引用。它不存在于 Struts2 之外。

    在 FreeMarker 中,包含模板共享包含模板的状态,例如数据模型和模板语言变量。不幸的是,没有像这样的上下文推送或弹出来更改包含模板的上下文。您可以使用&lt;#assign&gt;&lt;#global&gt; 将变量放在模板范围内,但这些不会取代共享模板数据模型。

    在普通的 FreeMarker 中,我认为您应该将子模板重构为宏或函数并 &lt;#import&gt; 它,将项目作为参数传入。

    【讨论】:

      【解决方案2】:

      在谷歌搜索和一些代码阅读之后,以下内容对我有用:

      <#list items as item>
      <#assign dummy=stack.push(item)/>
      <#include "/my/subtemplate.ftl"/>
      <#assign dummy=stack.pop()/>
      </#list>
      

      【讨论】:

      • 我得到“表达式堆栈未定义在线...”您是否应该以某种方式修改模板以访问堆栈变量?
      • 嗯,这在 Struts2 中对我有用(实现自定义标签)。可能是 Struts2 做了一些事情来使堆栈像这样可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2011-08-29
      • 1970-01-01
      • 2012-04-23
      • 2020-11-22
      相关资源
      最近更新 更多