UI计算过程
尽管Meteor平台体贴地为我们隐藏了UI计算的编写环节,看一眼Meteor生成的代码 还是很有好处的。下面的图揭示了Meteor打包期间对模板文件demo.html进行的处理:
你看到,Meteor根据我们的模板定义,创建了一个Template对象:Template.demo。 请注意Template构造函数的第二个参数,被称为渲染函数/RenderFunc,这就是我们 提到的UI计算过程。
渲染函数要完成的工作就是构造DOM元素组。HTML.H1()返回的是一个h1节点的 等价对象,HTML.P()返回的是一个p节点的等价对象。很显然,声明式的模板在这里 已经转化为命令式的计算过程了。
注意下对Blaze.View()的调用,它对应于模板标签{{price}},创建了一个子视图。 Blaze.View()的第二个参数也是一个函数,事实上,这个参数函数也是一个渲染函数/RenderFunc。 view.lookup("price")用来在当前模板的helpers中查找名为price的helper函数, 而Spacebars.mustache()则基本等价于对price helper函数的调用。最终,调用Blaze.View() 将返回price helper函数的执行结果。
≡ 启动反应式UI —— Meteor.render(template,parentNode)
启动反应式UI就是启动反应式UI计算过程。使用Meteor.render()方法将模板对象渲染 到DOM树中指定父元素之下,例如下面的示例将模板对象Template.demo返回的DOM元素组, 追加到document.body节点内:
Meteor.render(Template.demo,document.body);
在Meteor.render()内部,会通过Tracker来启动反应式计算。这样,当数据变化 时,UI就将自动得到更新。
执行以下命令复位test应用、删除源文件:
~/test$ meteor reset↵
~/test$ rm -rf \*↵
执行以下命令拷贝frp-blaze示例代码、运行并查看运行结果:
~/test$ cp ~/demos/frp-blaze/* .↵
~/test$ meteor↵
阅读frp-blaze示例代码,理解Meteor的反应式UI渲染原理。