流星,publish:composite。如何访问模板中的连接数据?

Meteor, publish:composite. how to access joined data in the template?

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

发布代码如下:

//publish subscriptions course view
Meteor.publishComposite('adminCourseSubscriptions', function(courseId){
  return {
    //get the subs for the selected course
    find: function(){
        return Subscriptions.find(
            {course_id: courseId}
        );
    },

    children: 
    [
        {   
            //get the subscriber details for the course
            find: function(sub){
                return Meteor.users.find({_id:sub.user_id});
            }

        }

    ]
  };

});

这里是模板订阅:

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();
  }
});

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

<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>

提前感谢您的任何建议!

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

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(...) 只会 发布 反应式连接,但不会 return 一组新的连接数据。

对于遇到类似问题并查看我的具体示例的任何其他人。就我而言,以下代码有效。根据 Matthias 的回答:

在模板助手中:

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

然后在模板中:

{{getUsername.username}}

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