8

例子:

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

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

问题:

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

  1. 使用模板助手
  2. 使用我的路线的“数据”属性

选项 1 示例:

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

选项 2 示例:

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

问题

这两种方法之间有什么显着差异吗?有理由偏爱其中一个吗?是否提供更好的性能?

非常感谢您的回答!

4

1 回答 1

7

这两种方法之间有什么显着差异吗?是否提供更好的性能?

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

有理由偏爱其中一个吗?

我会坚持使用 iron-router + data 方法,原因如下:

  • 仅当从服务器获取的数据准备好时,您才能使用 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
    })
  };
}

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

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

于 2014-08-19T14:00:33.410 回答