流星,发布:复合。如何访问模板中的联接数据?

时间:2016-03-06 09:55:10

标签: meteor meteor-blaze meteor-publications

所以我使用publishComposite在Meteor中进行集合连接。我有一个带有user_id外键的父集合(Subscriptions)。我在Meteor.users集合中查找用户名以获取实际的用户名,但是如何在html模板中实际打印它。我的订阅数据在那里,但我如何实际引用用户名?

以下是发布代码:

Template.adminCourseDetail.helpers({
  courseDetail: function(id){
    var id = FlowRouter.getParam('id');
    return Courses.findOne({ _id: id });
  },
  courseSubscriptions: function(){
    var id = FlowRouter.getParam('id');
    return Subscriptions.find({course_id:id})
  },
  users: function(){
    return Meteor.users.find();
  }
});

这是模板子文档:

<template name="adminCourseDetail">
<h1>Course Details</h1>
<p>Title: {{courseDetail.title}}</p>
<p>Description: {{courseDetail.description}}</p>
<p>Start Date: {{courseDetail.startDate}}</p>
<p>Number of sessions: {{courseDetail.sessions}}</p>
<p>Duration: {{courseDetail.duration}}</p>
<p>Price: {{courseDetail.price}}</p>
<p>{{userTest}}</p>
<a href="#">edit</a>
<a href="#">delete</a>
<h2>Course Subscriptions</h2>
{{#each courseSubscriptions}}
    <div class="row">
        <div class="col-md-3">{{username}}</div>
        <div class="col-md-3">{{sub_date}}</div>
    </div>
{{/each}}
</template>

和模板(垃圾)ps课程详细信息来自一个单独的集合。它更容易,我认为更高效的单独获取细节,这很好。它只是我无法正确显示的用户名:

filename

提前感谢任何建议!

2 个答案:

答案 0 :(得分:1)

据我了解您的问题,Subscriptions集合的文档仅包含属性user_id,引用Meteor.users集合中的相应用户文档。如果是这种情况,那么您需要添加一个额外的模板助手,它返回用户名:

Template.adminCourseDetail.helpers({
  // ...
  getUsername: function() {
      if (this.user_id) {
        let user = Meteor.users.find({
          _id: this.user_id
        });
        return user && user.username;
      }
      return "Anonymous";
    }
  // ...
});

之后,只需将{{username}}替换为{{getUsername}}

<template name="adminCourseDetail">
   <!-- ... -->
   <h2>Course Subscriptions</h2>
   {{#each courseSubscriptions}}
      <div class="row">
         <div class="col-md-3">{{getUsername}}</div>
         <div class="col-md-3">{{sub_date}}</div>
      </div>
   {{/each}}
   <!-- ... -->
</template>

可能你误解了 reywood:publish-composite 包的概念。使用Meteor.publishComposite(...)只会发布反应式联接,但不会返回一组新的联接数据。

答案 1 :(得分:1)

对于其他有类似问题的人,并查看我的特定示例。在我的情况下,以下代码工作。基于马蒂亚斯&#39;回答:

在模板助手中:

getUsername: function() {
  let user = Meteor.users.findOne({
      _id: this.user_id
    });
  return user;
}

然后在模板中:

{{getUsername.username}}

我的每个块都循环遍历从订阅集合返回的游标而不是课程集合,这就是为什么它比Matthias提供的代码更简单。