我对 Handlebars 模板引擎中的“范围”感到困惑。在其关于块助手的文档中,我阅读了
“通过数据选项提供的私有变量在所有后代范围内都可用。在父范围中定义的私有变量可以通过路径查询访问。”
我理解编程语言中使用的范围的含义({}
通常用于创建范围)。但是 Handlebars 模板中的“范围”指的是什么?
我对 Handlebars 模板引擎中的“范围”感到困惑。在其关于块助手的文档中,我阅读了
“通过数据选项提供的私有变量在所有后代范围内都可用。在父范围中定义的私有变量可以通过路径查询访问。”
我理解编程语言中使用的范围的含义({}
通常用于创建范围)。但是 Handlebars 模板中的“范围”指的是什么?
它实际上非常相似,请参见此处的示例:https ://jsfiddle.net/veraee/63gs19j3/11/
为了清楚起见,车把中有两种类型的“变量”:
模型/上下文。这是您在重新渲染时注入到模板中的数据。将其用于您的正常工作。这些变量通过其在 {{}} 中的名称在模板中被引用:
{{firstname}}
并通过“this”暴露在助手的 javascript 中:
this.firstname
“@”变量。这些数据是通过 javascript 在助手内部生成的。这些变量在模板中通过其名称以“@”前缀引用:
{{@foo}}
并通过“options.data”在助手的 javascript 中公开:
options.data.foo
OP 中车把文档的引用大约是第 2 位。
在编程语言中,“{”进入范围,在车把中,块“{{#myBlock...”进入范围。
与编程语言类似,您可以在内部范围(foo,bla)中使用来自外部范围的所有变量,但是如果您在内部范围(bla)中重新定义一个变量,则原始值将在内部范围中被遮蔽。当离开内部范围并再次进入外部范围时,您将再次获得 bla 的旧值。
但请注意编程语言的这些差异:
这种作用域不会通过编程语言语法的某些魔法发生,你必须自己做,正如文档还提到的那样,即这样:
data = Handlebars.createFrame(options.data);
作为奖励,您可以通过在名称前加上“../”来访问阴影变量(这在编程语言中通常是不可能的),这意味着:查看前一个(又名外部)范围(参见“{{@ ../bla}}" 在示例的内部范围内)。