2016-05-06 3 views
0

Я ищу способ получить в моих группах шаблонов из 3-х документов коллекции «Вопросы», которые имеют почти 50 документов. После первых трех документов (вопросов), показанных в шаблоне, пользователь должен решить (нажать кнопку), если он хочет получить следующие 3 документа или просто закончить.Как получить группы из n документов из курсора (коллекция)

Я не нашел способ, чтобы загрузить вопросы от 3 до 3. Это мой код:

collections.js:

Questions = new Mongo.Collection("questions"); 

myapp.js:

var lastQ=0 
Template.questions.helpers ({ 
    getGroupQuestions: function(){ 
    //Ideally if I only query one time the entire collection, and store in local var 
    var listOfQuest = Questions.find({$and: [ {qNumber: {$nin: answeredQ}}, {qNumber:{$gt:lastQ}}]}, {sort:{qNumber:1}}); 

    lastQ = lastQ + 3; 
    return {"Obj1":listOfQuest.fetch()[0], "Obj2":listOfQuest.fetch()[1], "Obj3":listOfQuest.fetch()[2]}; //This is not working, the returned object cant be read in template 
    } 
}); 

myapp.html:

<template name="questions"> 
    <h4> Tell us a little about yourself: </h4> 
    <form class="js-add-answers" id="add-answers"> 
    {{#each getGroupQuestions}} 
     <label for="{{qNumber}}">{{qDescription}}</label> 
     <input type="text" class="form-control" id="{{qNumber}}" placeholder="{{qHints}}"/> 
     <p></p> 
    {{/each}} 
    <button class="btn btn-warning js-join-event">Save and Join</button> 
    <button class="btn btn-warning js-load-more">Save and load more Q</button>   
    </form> 
</template> 

ответ

1

Что я вижу из вас, все, что я могу сказать, вам просто нужно использовать skip и limit в функции при получении документов. В идеале вы должны сначала удалить пакет «небезопасный» и «автоматически опубликовать», а в коде использовать технику PUB/SUB.

Ниже приведен код, который вы можете использовать для получения желаемого результата.

На конец сервера вы должны опубликовать код с подсчетом пропуска.

ПРОЕКТ/сервер/publish.js

Meteor.publish('getGroupQuestions', function(skipcount){ 
    return Questions.find(
          {$and: [ {qNumber : {$nin: answeredQ}}, 
            {sort : {qNumber:1}} 
          },{limit : 3, skip : skipCount} 
     }); 
}); 

На стороне клиента объявить ниже peice кода в качестве переменной сеанса, чтобы пропустить количество записей соответственно на 3;

клиент/шаблон/myapp.js

Session.setDefault('skip', 0); 
Deps.autorun(function(){ 
    Meteor.subscribe('getGroupQuestions', Session.get('skip')); 
}); 

Template.questions.events ({ 
    "submit .load-more" : function() { 
     Session.set(Session.get('skip') + 3) 
    } 
}); 

В myapp.html, вы должны сделать небольшое изменение и название кнопки, как показано ниже;

клиент/шаблон/myapp.html

<button name="load-more" class="btn btn-warning js-load-more">Save and load more Q</button> 

Объяснение потока


  1. Изначально при загрузке страницы, это даст вам топ 3 результаты как pe r логики.
  2. Когда пользователь нажимает кнопку для , загружается больше, событие шаблона вызывается и сеанс устанавливается с новым значением «skip» (увеличивается на 3).
  3. Из-за повторного действия и асинхронного поведения Meteor контейнер публикации автоматически обновляет коллекцию со следующими тремя вопросами, повторно запуская тот же запрос, но с новым счетчиком пропуска в сеансе. Страница не будет обновляться, и вы должны задать новую группу вопросов.
+0

Спасибо! Ваш код выглядит довольно чистым ... Просто сомневаюсь: должен ли я вызвать результат в моем шаблоне с помощью такого помощника: 'template.questions.helpers ({threeQuest: function() {return Questions.find()}}); ' Интересно, правильно ли это, так как у меня есть другая подписка на вопросы в другом шаблоне, которые требуют загрузки всей коллекции. – Ruben

+0

Объем подписки остается неизменным только в шаблоне. Делайте подписки на отдельных шаблонах отдельно, вы будете чувствовать себя быстрее рендеринга. Итак, Дорогой друг, независимо от того, сколько мест вы используете подзаголовок, рендеринг в помощнике шаблона зависит от условия, которое вы передаете в методе поиска. Я дал вам код, чтобы найти точные три свежих вопроса. Вы также можете скопировать его в помощнике шаблона. Никакого вреда не должно быть сделано. В любом случае другая подписка на шаблоны невредима. Огромное спасибо. –

+0

Хорошо. Еще один вопрос (будьте терпеливы с этим новичком, пожалуйста = S): Как я подписываюсь на свой шаблон? Должен ли я помещать «sub» внутри помощника шаблона? Уже я поместил свою подписку внутри Meteor.isClient и создал помощника, как упоминалось выше, но запрос Questions.find в хелпере извлекает все записи из коллекции, а не только необходимые 3. Я думаю, что проблема связана с моей другой подпиской, которая приносит все записи из «Вопросов» в minimondodb. Эта подписка также требуется для другого шаблона. – Ruben

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