2016-05-06 2 views
0

私は、約50の文書を持つコレクション「質問」の3つの文書からなるテンプレートグループを検索する方法を探しています。テンプレートに表示されている最初の3つのドキュメント(質問)の後、次の3つのドキュメントを取得するか、まったく完了するかをユーザーが決める(ボタンを押す)必要があります。カーソル(コレクション)からn個の文書のグループを取り出す方法

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 
    } 
}); 

私は3次まで3からの質問をロードする方法を発見していないことは私のコードです

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

私があなたから質問する内容は、ドキュメントを取得する際にという制限をにスキップするだけでよいということだけです。理想的には、まず「安全でない」パッケージと「自動公開」パッケージを削除し、コード内でPUB/SUB技術を使用するのが理想的です。

以下は、希望する結果を得るために使用できるコードです。

サーバ側では、スキップ回数を指定してコードを公開する必要があります。

PROJECT /サーバ/ publish.jsクライアント側で

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

3によって従ってレコード数をスキップするセッション変数としてコードのpeice下に宣言する。 myapp.htmlで

クライアント/テンプレート/ 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

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

説明


  1. 当初は、ページのロード時、それはトップあなたを与えるだろうpeとしての結果3件rロジック。
  2. のボタンをクリックすると、がロードされ、テンプレートイベントが呼び出され、セッションは新しい値「skip」(3刻み)で設定されます。
  3. メテオの再活性化と非同期動作のために、パブリッシングコンテナは、次の3つの質問でコレクションを自動更新します。同じクエリを再度実行しますが、セッション内に新しいスキップカウンタが表示されます。 ページは更新されず、新しいグループの質問が表示されます。
+0

ありがとうございました!あなたのコードはきれいに見えます....ちょっと疑う:私のテンプレートの結果は、そのようなヘルパーを使ってテンプレート内で呼び出すべきですか? 'template.questions.helpers({threeQuest:function {)Questions.find()}} ); ' コレクション全体をロードする必要がある他のテンプレートの質問に対する別のサブスクリプションがあるので、それが正しいかどうか疑問です。 – Ruben

+0

サブスクリプションのスコープはテンプレート内でのみ保持されます。特定のテンプレートを個別に購読すると、レンダリングが速くなります。だから親愛なる友人、サブクラスを使っている場所の数にかかわらず、テンプレートヘルパーのレンダリングはfindメソッドで渡す条件に依存します。私は正確に3つの新鮮な質問を見つけるためのコードを教えました。それをテンプレートヘルパーにも貼り付けることができます。害はない。とにかく、他のテンプレートサブスクリプションは無事です。どうもありがとうございます。 –

+0

ちょうどもう1つの質問(この初心者で喜んでください= S):自分のテンプレートに特有のサブスクリプションはどうしますか?私はテンプレートヘルパーの中に 'sub'を置くべきですか?すでにMeteor.isClientの中にサブスクリプションを入れて、上記のようなヘルパーを作成しますが、ヘルパーのQuestions.findクエリはコレクションからすべてのレコードを取得しています。私はその問題が、「質問」からすべての記録をミニモードブブにしている私の他のサブスクリプションによって引き起こされたと思います。そのサブスクリプションは別のテンプレートにも必要です。 – Ruben

関連する問題