我应该在路由逻辑或流星模板助手中提供数据吗?

时间:2014-08-19 13:35:40

标签: performance meteor routing iron-router spacebars

实施例

我正在编写一个处理博客帖子列表的Meteor应用程序。所有博客文章都存储在名为“帖子”的集合中。我使用Iron Router进行路由。

我想向用户显示特定作者创建的所有帖子的列表。此列表将使用Spacebars显示。因此,我需要向模板提供数据。

问题:

据我所知,有两种方法可以做到这一点:

  1. 使用模板助手
  2. 使用我路线的'数据' -property
  3. 选项1示例:

    Template.postList.helpers({
    postsToDisplay: function(){
        return Posts.find({author: 'someAuthor'});
    }
    })
    

    选项2示例:

    //Inside my route
    data: function(){
        return {postsToDisplay: Posts.find({author: 'someAuthor'})};
    }
    

    问题

    这两种方法之间是否存在显着差异?是否有理由偏爱另一个?一个人能提供更好的表现吗?

    非常感谢您的回答!

1 个答案:

答案 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
    })
  };
}

此设计模式允许我们定义一个路径,该路径提供表示给定作者的帖子列表的数据上下文,但您也可以定义另一个路径,提供将按类别列出帖子的数据上下文。

因此,通过将数据提供者角色从模板助手移出到路径定义,我们有了一个更可重用的模板,这很好。