2

我了解 Blaze 用于通过使用 Tracker 使模板反应。我知道一个模板包含许多 View 对象,每个模板元素之一。

视图是“反应模板的构建块”并且“代表 DOM 的反应区域”。并且(来自文档), View 可以对应于“当前模板助手、事件处理程序、回调或自动运行”。

但我很困惑究竟什么是 View 对象,以及 Blaze View 如何,Template.mytemplate.helpers()Template.mytemplate.autorun(). 例如,每个辅助函数是否对应一个 View 对象?还是仅当函数包含响应式数据源时?该autorun方法是针对整个模板的,一个View如何与一个包含多个View对象的整个模板关联呢?

4

1 回答 1

3

它有点难以解释,因为自从我更好地理解它以来,他们已经改变了很多。

如果你有这样的模板

<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何时重绘的方法 - 仅表示其中的内容。

  • firstNodelastNode。这给出了第一个 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(一个特殊的内部)会告诉视图重绘而不触及另一个视图。

我希望我已经回答了你的问题。如果您有任何更具体的信息,请告诉我,如果可以,我将使用此信息编辑答案。

于 2015-02-11T07:40:12.073 回答