2014-11-25 4 views
1

У меня есть две коллекции Монго:Метеор - Шаблон из нескольких коллекций

  • Сообщений: {_id: "123", text: "some text", authorid: "456"}
  • Авторы: {_id: "456", name: "Cosmo"}

И я хотел бы, чтобы отобразить следующий шаблон:

<template name="Postslist"> 
    {{#each posts}} 
    {{>Post}} 
    {{/each}} 
</template> 

<template name="Post"> 
    {{text}} 
    {{name}} 
</template> 

Итак, я создал почтовый помощник для отображения связанного имени :

Template.Post.helpers({ 
    name: function() { 
    var author = Authors.find({_id: this.authorid}); 
    return author.name; 
    } 
}); 

К сожалению, это не показывает имя автора, как я думал. Что я делаю неправильно и как я должен решать такую ​​ситуацию?

Я знаю, что я не должен использовать внешние ключи в базах данных NoSQL, но коллекции автоматически заполняются сторонним приложением, и я не могу их модифицировать.

+0

[Статья] (https://www.discovermeteor.com/blog/reactive-joins-in-meteor/) может помочь. Кстати, вы публикуете/подписываетесь как на должности, так и на авторов? – user3557327

ответ

1

Find возвращает указатель mongo не соответствующие документы. Чтобы получить согласованные документы с помощью курсора, вы должны использовать fetch, однако выборка не является реактивной.

Чтобы исправить вашу проблему и оставаться реактивной, вы должны вернуть результат findOne.

Template.Post.helpers({ 
    getAuthor: function() { 
     return Authors.findOne({_id: this.authorid}); 
    } 
}); 

изменения шаблона:

<template name="Post"> 
    {{text}} 
    {{#with getAuthor}} 
     {{name}} 
    {{/with}} 
</template> 
+1

Большое спасибо, что за решение! Блестящий и очень элегантный тоже. – Cosmo

Смежные вопросы