tom*_*met 8 performance routing meteor iron-router spacebars
我正在编写一个处理博客帖子列表的Meteor应用程序.所有博客文章都存储在名为"帖子"的集合中.我使用Iron Router进行路由.
我想向用户显示特定作者创建的所有帖子的列表.此列表将使用Spacebars显示.因此,我需要向模板提供数据.
据我所知,有两种方法可以做到这一点:
选项1示例:
Template.postList.helpers({
postsToDisplay: function(){
return Posts.find({author: 'someAuthor'});
}
})
Run Code Online (Sandbox Code Playgroud)
选项2示例:
//Inside my route
data: function(){
return {postsToDisplay: Posts.find({author: 'someAuthor'})};
}
Run Code Online (Sandbox Code Playgroud)
这两种方法之间是否存在显着差异?是否有理由偏爱另一个?有人提供更好的表现吗?
非常感谢您的回答!
这两种方法之间是否存在显着差异?有人提供更好的表现吗?
不是真的,毕竟只是设计选择.
是否有理由偏爱另一个?
我会坚持使用铁路由器+数据方法,原因如下:
只有当从服务器获取的数据准备就绪时,才能使用waitOn实际显示列表,Router.onBeforeAction("loading")并使用loadingTemplate提高整体用户体验.
您可以设计一个与数据无关的postsList模板,您可以使用不同的上下文进行提供.
最后一点特别有趣,因为它允许您定义一个可重用的模板,您可以使用该模板显示最近的帖子列表,一个类别中的帖子列表,某个作者想要实现的帖子列表第一名,等等......
<template name="postsList">
{{#each posts}}
{{> postListItem}}
{{/each}}
</template>
Run Code Online (Sandbox Code Playgroud)
在这里你可以将posts定义为postsList的帮助器,但是最好让调用postsList的父模板将post分配给它需要的任何东西.
template:"postsList",
data:function(){
return {
posts:Posts.find({
"author":this.params.author
})
};
}
Run Code Online (Sandbox Code Playgroud)
此设计模式允许我们定义一个路径,该路径提供表示给定作者的帖子列表的数据上下文,但您也可以定义另一个路径,提供将按类别列出帖子的数据上下文.
因此,通过将数据提供者角色从模板助手移出到路由定义,我们有一个更可重用的模板,这很好.