2015-02-11 86 views
2

据我所知,Blaze用于通过利用Tracker制作一个反应模板。我知道一个模板包含许多View对象,每个模板元素之一。Blaze视图和模板之间的关系是什么?

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

但我很困惑,究竟是一个视图对象,走出查看如何与喜欢的东西Template.mytemplate.helpers(),以Template.mytemplate.autorun()。例如,每个帮助函数是否对应一个View对象?或者仅当该功能包含反应性数据源时? autorun方法适用于整个模板,View如何与具有多个View对象的整个模板关联?

回答

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可以是ch受到帮手的冲击。

每个助手不一定会匹配到每个视图。每个视图代表可以被动地改变的区域。它看起来就像是这样,因为帮手可以改变内容。您可以拥有一个助手和多个视图&您还可以从其他类型的车把表达式(如{{#if}})获取视图。

当每个Blaze.View部分在屏幕上呈现时,每个部分都有一个instance。这意味着你可以有相同的确切视图(可能定义为一个变量?),但屏幕上显示两个不同的值。每个人都可以有一个实例。每个实例具有如下方法:

  • autorun。允许您将反应方法添加到Blaze.View。这意味着如果您可以添加一个包含Tracker计算的方法,它告诉Blaze.View何时重绘 - 仅表示其中的内容。

  • firstNodelastNode。这给出了第一个DOM元素和Blaze.View的最后一个DOM元素。这使Blaze渲染引擎能够'知道'如果从运行中改变HTML/DOM的位置,可以更改它们autorun

  • onXXX这些是视图创建或销毁时的事件。这些最终会冒泡到包含视图的模板。

还有其他人,但以上是关于模板实例的问题。

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

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

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

相关问题