2015-12-13 3 views
2

Не использовать публикацию или waitOn или другую передовую технику для обучения. Почему-то я не могу заставить это работать.данные возврата из двух коллекций с данными: функция в железе: маршрутизатор Meteor

Router.route('/browse/:_id', function(){ 
      this.render('navigation', {to: 'navbar'}); 
      this.render('header', {to: 'header'}); 
      this.render('website', { 
       to: 'main', 
       data: function(){ 
       return { 
        websites: Websites.findOne({_id: this.params._id}), 
        comments: Comments.find({siteId: this.params._id}) 
        } 
       } 
      }); 
     }); 

Этот код отлично подходит для комментариев, а «веб-сайты» не будут отображаться.
Поля под «сайтов» будет оказывать в HTML, только если я вернуть его, как это:

data: function(){ /*This works for websites but if used on comments it won't*/ 
     return Websites.findOne({_id: this.params._id}) 
     } 

в то время как для «комментарии» работает только тогда, когда я даю в нотации Object или ключ-значение пары:

data: function(){ /*This works for comments but if used on websites it wont*/ 
       return {comments: Comments.find({siteId: this.params._id})} 
       } 

Моя проблема: мне нужно получить данные из обеих коллекций в одном шаблоне. Любое предложение очень приветствуется. Благодаря!

Редактировать Включая моего HTML шаблонов, а также: «сайт» шаблон

<template name="website"> 
<div class="container"> 
    /*solved by including #with websites here*/ 
    <div class="website"> 
     <div class="website-header js-url"> 
      <h4>{{title}}</h4> 
     </div> 
     <div class="website-body"> 
      <tr><td>URL:</td> <td>{{url}}</td></tr> 
      <tr><td>Description</td><td>{{description}}</td></tr> 

      <div class="votes"> 
       <div class="upvote_row"> 
        <tr> 
         <td>Up Votes:</td> 
         <td>{{upVote.length}}<a href="#" class="btn btn-default js-upvote"><span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span></a></td> 
        </tr> 
       </div> 
       <div class="downvote_row"> 
        <tr> 
         <td>Down Votes:</td> 
         <td>{{downVote.length}}<a href="#" class="btn btn-default js-downvote"><span class="glyphicon glyphicon-arrow-down" aria-hidden="true"></span></a></td> 
        </tr> 
       </div> 
      </div> 

      <tr><td>Posted By:</td><td><a href class="">{{createdBy}}</a> on {{createdOn.toDateString}} at {{createdOn.toLocaleTimeString}} </td></tr>    
     </div> 
    </div> 
    /* /with */ 
    <div class="comments"> 
     <h5>Comment Section</h5> 
     {{#if currentUser}} 
     <a class="btn btn-default js-toggle-comment-form" href> 
      <span class="glyphicon glyphicon-comment" aria-hidden="true"></span> 
     </a> 
     {{/if}} 
     <div id="comment_form" class="hidden_div"> 
      <form class="js-save-comment-form"> 
       <div class="form-group"> 
       <label for="user_comment">Add Comment</label> 
       <input type="textfield" class="form-control" id="user_comment" placeholder="Your views on this website" required> 
       </div> 

       <button type="submit" class="btn btn-default">Submit</button> 
       <button class="btn btn-default js-cancel-submit">Cancel</button> 
      </form> 
     </div> 

     <ol> 
     {{#each comments}} 
     {{>comment_item}} 
     {{/each}} 
     </ol> 
    </div> 

</div> 
</template> 

Тогда мой комментарий Шаблон, который работает безупречно.

<template name="comment_item"> 
    <li class="card-panel teal darken-1 comments"> 

     <blockquote> 
      <p class='card-content'> 
       {{userComment}} 
      </p> 
      <footer> 
       <a href="{{url}}">{{postedBy}}</a> on {{postedOn.toDateString}} at {{postedOn.toLocaleTimeString}} 
       <a href="#" class="btn btn-default js-upvote"> 
        <span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span> 
        <span class="badge badge-notify">{{upVote.length}}</span> 
       </a> 
       <a href="#" class="btn btn-default js-downvote"> 
        <span class="glyphicon glyphicon-arrow-down" aria-hidden="true"></span> 
        <span class="badge badge-notify">{{downVote.length}}</span> 
       </a> 
      </footer> 
     </blockquote> 
    </li> 
</template> 
+1

Две вещи: 1.) Я бы попробовал использовать шаблон с навигацией, заголовком, нижним колонтитулом и т. Д., Которые были включены в шаблон, а затем отобразить один шаблон. 2.) Я не знаю, почему он ведет себя таким образом, но может иметь какое-то отношение к тому факту, что findOne() вернет объект, а find() вернет курсор. Попробуйте вместо этого использовать find(). Fetch()? –

ответ

1

Вы также должны показать свой код HTML-кода. Я подозреваю, что вы ссылаетесь только на ключи для объекта веб-сайтов, а не на использование {{websites.keyname}}. Основываясь на вашей функции данных, ваш контекст данных будет {websites: an object, comments: a cursor} Если вы попытаетесь получить доступ к {{keyname}} со своих сайтов, вы ничего не получите, потому что в вашем контексте данных нет ключа верхнего уровня, который называется keyname.

+0

Привет, как мы настраиваем это 'keyname'? Вы правы, что это было связано с тем, как я обращался к клавишам на «веб-сайтах» из моего шаблона. Я решил его вчера уже с тем же кодом, что и выше (сначала один с обоими), после того как я включил {{с веб-сайтами}}, прежде чем я начал ссылаться на ключи от 'websites' –

+0

' keyname' - это всего лишь ключ верхнего уровня (s) у вас есть в документе 'websites'. Если есть клавиша верхнего уровня, называемая 'foo', вы можете ссылаться на нее с помощью' {{websites.foo}} ' –