1

我对 Handlebars 模板引擎中的“范围”感到困惑。在其关于块助手的文档中,我阅读了

“通过数据选项提供的私有变量在所有后代范围内都可用。在父范围中定义的私有变量可以通过路径查询访问。”

我理解编程语言中使用的范围的含义({}通常用于创建范围)。但是 Handlebars 模板中的“范围”指的是什么?

4

1 回答 1

3

它实际上非常相似,请参见此处的示例:https ://jsfiddle.net/veraee/63gs19j3/11/

为了清楚起见,车把中有两种类型的“变量”:

  1. 模型/上下文。这是您在重新渲染时注入到模板中的数据。将其用于您的正常工作。这些变量通过其在 {{}} 中的名称在模板中被引用:

    {{firstname}}

并通过“this”暴露在助手的 javascript 中:

this.firstname
  1. “@”变量。这些数据是通过 javascript 在助手内部生成的。这些变量在模板中通过其名称以“@”前缀引用:

    {{@foo}}

并通过“options.data”在助手的 javascript 中公开:

options.data.foo

OP 中车把文档的引用大约是第 2 位。

在编程语言中,“{”进入范围,在车把中,块“{{#myBlock...”进入范围。

与编程语言类似,您可以在内部范围(foo,bla)中使用来自外部范围的所有变量,但是如果您在内部范围(bla)中重新定义一个变量,则原始值将在内部范围中被遮蔽。当离开内部范围并再次进入外部范围时,您将再次获得 bla 的旧值。

但请注意编程语言的这些差异:

  1. 这种作用域不会通过编程语言语法的某些魔法发生,你必须自己做,正如文档还提到的那样,即这样:

    data = Handlebars.createFrame(options.data);

  2. 作为奖励,您可以通过在名称前加上“../”来访问阴影变量(这在编程语言中通常是不可能的),这意味着:查看前一个(又名外部)范围(参见“{{@ ../bla}}" 在示例的内部范围内)。

于 2017-11-22T16:41:02.277 回答