1

所以我使用 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>

在此先感谢您的任何建议!

4

2 回答 2

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包的概念。UsingMeteor.publishComposite(...)只会发布一个响应式连接,但它不会返回一组新的连接数据。

于 2016-03-06T10:08:34.453 回答
1

对于其他有类似问题并查看我的特定示例的人。就我而言,以下代码有效。根据马蒂亚斯的回答:

在模板助手中:

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

然后在模板中:

{{getUsername.username}}

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

于 2016-03-06T11:22:04.717 回答