Blaze视图和模板之间有什么关系?

时间:2015-02-11 05:44:48

标签: templates meteor meteor-blaze meteor-helper meteor-tracker

据我所知,Blaze用于通过使用Tracker制作模板。我知道模板包含许多View对象,每个模板元素之一。

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

但我很困惑View对象究竟是什么,以及Blaze View 如何与<{1}}或Template.mytemplate.helpers()相关联。例如,每个辅助函数是否对应一个View对象?或者仅当功能包含反应数据源时? Template.mytemplate.autorun()方法适用于整个模板,View如何与具有多个View对象的整个模板相关联?

1 个答案:

答案 0 :(得分:2)

它有点难以解释,因为他们已经改变了很多,因为我更了解它。

如果你有这样的模板

<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。这给出了Blaze.View的第一个DOM元素和最后一个DOM元素。如果运行autorun

  • 发生变化,Blaze渲染引擎可以“知道”在何处更改任何HTML / DOM
  • onXXX这些是创建或销毁视图时的事件。这些最终会冒泡到包含视图的模板。

还有其他一些,但以上是关于Template实例的重要事项。

当您为整个模板运行autorun时,这是一个完全独立的计算,这就是为什么您无法直接从模板中的this.autorun更改DOM的原因。您必须使用反应变量,例如设置Session.set("vala", "new value")

当您更改Session.set("vala", "new value")时,将重绘第一个Blaze.View。这是因为它有一个.autorun(一个特殊的内部)将告诉视图重绘而不触及另一个视图。

我希望我已经回答了你的问题。如果您有任何更具体的信息,请您知道,请告诉我,如果可以的话,我会用这些信息编辑答案。