合并Meteor中的集合

Zac*_*ach 9 meteor

想象一下,你有多个集合要显示在一个单一的社交新闻源,例如PostsUsers(新注册).您如何在按创建日期排序的列表中反应性地显示两者?

想法1 - 在客户端合并

您可以单独发布实体,并在客户端中按日期对每个实体进行排序,然后将它们合并到一个排序的数组中,然后在{{#each}}迭代器中显示它们.问题: AFAIK这需要将反应式游标展平为静态数组,因此现在页面不会更新.(也许有一种方法可以在任何集合发生变化时让页面重新计算这个数组,从而实现这种方法?)

想法2 - 创建一个新的集合

比方说,你创建了一个新的集合FeedItems.当创建新的PostUser创建时,您还可以创建新的FeedItem并将相关信息复制到其中.现在,在客户端中显示项目非常简单.问题:现在规范对象与FeedItem它们的版本之间没有反应性,因此如果有人更改其名称,删除帖子等,这将不会反映在Feed中.(也许有一种方法可以在集合之间创建反应来挽救这种方法?)

想法3 - 在出版物中合并

也许有一些方法可以坚持使用现有的集合,但是创建一个'newsFeed'可以某种方式合并它们的附加出版物.但是,我没有看到任何这样做的方法.我在文档中看到你可以发布一系列集合,但是AFAIK这相当于一次发布一个集合.

其中一种方法是否正确?或者还有另一个我没有想到的?

Dav*_*don 20

到目前为止,最简单的解决方案是在模板助手中将它们合并到客户端上.例如:

Template.dashboard.helpers({
  peopleAndPosts: function() {
    var people = People.find().fetch();
    var posts = Posts.find().fetch();
    var docs = people.concat(posts);
    return _.sortBy(docs, function(doc) {return doc.createdAt;});
  }
});
Run Code Online (Sandbox Code Playgroud)

和模板(假设人和帖子有一个name):

<template name="dashboard">
  <ul>
    {{#each peopleAndPosts}}
    <li>{{name}}</li>
    {{/each}}
  </ul>
</template>
Run Code Online (Sandbox Code Playgroud)

是被动的,因为帮助程序是一个反应性上下文,因此任何更改PeoplePosts将导致重新计算返回的数组.请注意,因为您没有返回游标,所以对任一集合的任何更改都将导致整个集再次呈现.如果返回的数组的长度相对较短,这将不是什么大问题.