在Spark中,Landmark和Branch Label之间有什么区别?

时间:2012-10-15 13:15:31

标签: meteor

在这里阅读不同的Spark注释类型:https://github.com/meteor/meteor/wiki/Spark

我仍然对需要放置地标和分支标签的地方感到困惑。两者之间的区别是什么,Handlebars何时称呼它们?我是Blade templating engine的作者,我正在尝试将Blade与Spark集成。

1 个答案:

答案 0 :(得分:1)

在Handlebars中,每个模板和每个{{#constant}} ... {{/ constant}}区域都包含一个地标。当DOM的一个区域被反应更新时,旧的和​​新的地标被匹配以用于DOM保存,生命周期回调(创建/销毁)和地标本地状态。

标记由包含它们的分支标签形成的“路径”标识。 (地标本身对路径没有贡献。)拥有相同路径的两个地标是违法的。同样重要的是,计算将在标签区域内的HTML或从函数参数的主体到labelBranch或createLabel的地标。这是因为当你调用这些函数时,Spark实际上已经匹配了DOM,因此它知道在运行之前是否调用“created”(因为这是一个新的标志)(因为它是旧的重新渲染)计算HTML的功能。

Handlebars在几个地方调用labelBranch来区分任何应该是不同的模板(地标)调用。基本上,标签应该确定导致模板调用的“调用堆栈”。模板源({{> someTemplate}})中的每个模板调用都会获得一个标签,并且还会对循环进行检测,根据相关对象的_id标记循环的每个迭代,或者如果不存在则标记其他一些启发式一。 (请注意,Meteor模板中有两个循环代码路径,一个用于数据库中的可观察游标,另一个用于其他所有游标,如普通数组。)

在包含“foo”模板的模板的这个片段中,每次调用“foo”(包括循环的每次迭代)都在不同的分支标签内完成:

{{> foo}}
{{> foo}}
{{#each collection}}
  {{> foo}}
{{/each}}
{{> foo}}

如果帮助者直接调用模板函数会怎样?

var myHelper = function () {
  return Template.foo() + " " + Template.bar();
}

在这种情况下,保存日期是因为模板包还将每个模板包装在“Template.foo”或“Template.bar”等标签中(标签很便宜)。但是,如果帮助程序使用不同的参数多次调用同一模板,则会出现重复的标记问题;在这种情况下,由帮助程序删除其他分支标签以消除歧义。

由模板包生成的Template.foo的实现(在deftemplate.js中)使用以下嵌套注释,从外部到内部:标签,数据,地标,事件,隔离。这个订单非常有限。例如,封闭事件注释的地标用于查找数据。隔离注释有意在内部。

车把和模板包的当前分解可能不适合添加额外的模板包!这对我们来说是一个新的前沿。不过,我们对拥有更多模板语言非常感兴趣,并且很高兴你正在研究它。