2015-01-14 5 views
10

コレクションの数だけをユーザーに公開することはできますか?私はホームページに総数を表示したいが、すべてのデータをユーザーに渡すのではない。これは私が試したものですが動作しません:メテオ - コレクションの数だけを公開する

Meteor.publish('task-count', function() { 
    return Tasks.find().count(); 
}); 

this.route('home', { 
    path: '/', 
    waitOn: function() { 
     return Meteor.subscribe('task-count'); 
    } 
}); 

これを試してみると、無限の読み込みアニメーションが得られます。いくつかのヘルパーに

var count; /// Global Client Variable 

Meteor.startup(function() { 
    Meteor.call("count", function (error, result) { 
     count = result; 
    }) 
}); 

リターンcount

サーバー:

+0

はそれらの 'Tasks'は、ユーザーまたは何かに属しているのですか?なぜ私はあなたが 'ユーザ 'コレクションiteselfの中でそのカウントを維持し、そこから得ることができるのですか – ajduke

答えて

16

Meteor.publish関数はカーソルを返す必要がありますが、ここではTasksコレクション内のドキュメントの合計数であるNumberを直接返します。

Meteorの文書を数えることは、あなたが適切なやり方をしたい場合に表示されるよりも、驚くほど難しい作業です。

パッケージros:publish-countstmeasday:publish-countsのフォーク)は、fastCountオプションを使用して、小さなコレクション(100-1000)またはより大きなコレクション(数万)の「ほぼ正確な」カウントに対して正確なカウントを提供します。

あなたはそれをこのように使用することができます。

// server-side publish (small collection) 
Meteor.publish("tasks-count",function(){ 
    Counts.publish(this,"tasks-count",Tasks.find()); 
}); 

// server-side publish (large collection) 
Meteor.publish("tasks-count",function(){ 
    Counts.publish(this,"tasks-count",Tasks.find(), {fastCount: true}); 
}); 

// client-side use 
Template.myTemplate.helpers({ 
    tasksCount:function(){ 
    return Counts.get("tasks-count"); 
    } 
}); 

あなたはクライアント側の反応回数だけでなく、サーバー側の合理的パフォーマンスの実装を取得します。

この問題は、推奨読書です(有償)防弾流星のレッスンで説明されています。https://bulletproofmeteor.com/

6

は私がMeteor.call

クライアントを使用することになり

Meteor.methods({ 
    count: function() { 
    return Tasks.find().count(); 
    } 
}) 

*反応性ではないでしょう。このソリューションに注意してください。しかしながら、反応性が望まれるならば、それを組み込むことができる。

関連する問題