它有点难以解释,因为自从我更好地理解它以来,他们已经改变了很多。
如果你有这样的模板
<template name="mytemplate">
<p>{{value1}}</p>
<p>{{value2}}</p>
</template>
和这样的助手:
Template.mytemplate.helpers({
value1: function() { return Session.get("vala"); },
value2: function() { return Session.get("valb"); },
});
它最终会是这样的:
Template["mytemplate"] = new Template("Template.mytemplate", (function() {
var view = this;
return [HTML.P(Blaze.View(function() {
return Spacebars.mustache(view.lookup("value1"));
})), "\n ", HTML.P(Blaze.View(function() {
return Spacebars.mustache(view.lookup("value2"));
}))];
}));
你可以看到我有两个助手,现在模板由两个组成Blaze.View
,一个用于可以由助手更改的 DOM 的每个区域。
每个助手不一定与每个视图匹配。每个视图代表一个可以被动更改的区域。看起来好像是这样,因为助手可以更改内容。您可以拥有一个助手和多个视图,您还可以拥有来自其他类型的车把表达式的视图,例如{{#if}}
.
当每个Blaze.View
部分在屏幕上呈现时,每个部分都有一个instance
. 这意味着您可以拥有相同的精确视图(可能定义为变量?)但屏幕上显示两个不同的值。每个都可以有一个实例。每个实例都有以下方法:
自动运行。允许您向Blaze.View
. 这意味着如果您可以添加一个包含Tracker
计算Blaze.View
何时重绘的方法 - 仅表示其中的内容。
firstNode
和lastNode
。这给出了第一个 DOM 元素和最后一个 DOM 元素Blaze.View
。这允许 Blaze 渲染引擎“知道”在运行时发生变化时在哪里更改任何 HTML/DOMautorun
onXXX
这些是创建或销毁视图时的事件。这些最终会冒泡到包含视图的模板。
还有其他的,但以上是与模板实例有关的那些。
当您autorun
为整个模板运行时,它是一个完全独立的计算,这就是为什么您不能直接从this.autorun
模板中更改 DOM。您必须使用响应变量,例如 setting Session.set("vala", "new value")
。
当您更改Session.set("vala", "new value")
时,第一个Blaze.View
将被重绘。这是因为它有一个.autorun
(一个特殊的内部)会告诉视图重绘而不触及另一个视图。
我希望我已经回答了你的问题。如果您有任何更具体的信息,请告诉我,如果可以,我将使用此信息编辑答案。