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