2016-03-06 2 views
0

Итак, я использовал publishComposite для объединения коллекции в Meteor. У меня есть родительская коллекция (Subscriptions) с внешним ключом 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}); 
      } 

     } 

    ] 
    }; 

}); 

вот шаблон subdcriptions:

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> 

Заранее благодарим за любые предложения!

ответ

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(...) будет только опубликовать реактивное соединение, но оно не вернет новый набор объединенных данных.

+0

С благодарностью Matthias я полностью забыл, что при вызове помощника изнутри каждого блока вспомогательный вызов вызывается в контексте курсора, который вы перебираете, тем самым делая данные в этом курсоре доступными с помощью «этого». Я совершенно смутился, пытаясь понять, как связать данные из коллекций. :) –

1

Для всех, кто имеет аналогичную проблему и смотрит на мой примерный пример. В моем случае работал следующий код. На основании ответа Матиаса:

В помощнике шаблона:

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

, а затем в шаблоне:

{{getUsername.username}} 

Мой каждый блок зацикливания через курсор возвращается из коллекции подписок, а не сборник курсов, поэтому он проще, чем код, предоставленный Matthias.