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

tom*_*met 8 performance routing meteor iron-router spacebars

例:

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

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

问题:

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

  1. 使用模板助手
  2. 使用我的路线的'data'属性

选项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)

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

非常感谢您的回答!

sai*_*unt 7

这两种方法之间是否存在显着差异?有人提供更好的表现吗?

不是真的,毕竟只是设计选择.

是否有理由偏爱另一个?

我会坚持使用铁路由器+数据方法,原因如下:

  • 只有当从服务器获取的数据准备就绪时,才能使用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)

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

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