我在我的应用中使用meteor-paginated-subscription包。在服务器上,我的出版物如下所示:
Meteor.publish("posts", function(limit) {
return Posts.find({}, {
limit: limit
});
});
在客户端:
this.subscriptionHandle = Meteor.subscribeWithPagination("posts", 10);
Template.post_list.events = {
'click #load_more': function(event, template) {
template.subscriptionHandle.loadNextPage();
}
};
这很好用,但如果所有数据都加载到客户端上,我想隐藏#load_more按钮,使用这样的帮助:
Template.post_list.allPostsLoaded = function () {
allPostsLoaded = Posts.find().count() <= this.subscriptionHandle.loaded();
Session.set('allPostsLoaded', allPostsLoaded);
return allPostsLoaded;
};
问题是Posts.find()。count()返回客户端上加载的文档数,而不是服务器上可用的数量。
我查看了Telescope项目,该项目也使用了meteor-paginated-subscription软件包,我看到code做了我想做的事情:
allPostsLoaded: function(){
allPostsLoaded = this.fetch().length < this.loaded();
Session.set('allPostsLoaded', allPostsLoaded);
return allPostsLoaded;
}
但我不确定它是否真的有效。将代码移植到我的代码中是行不通的。
最后,它确实看起来像Mongo支持我想做的事情。 docs表示默认情况下,cursor.count()忽略limit的影响。
好像所有的碎片都在那里,但是我把它们放在一起很麻烦。
答案 0 :(得分:7)
答案 1 :(得分:5)
我认为你可以在meteor doc
中看到演示:counts-by-room它可以帮助您在服务器上发布帖子的计数并在客户端
获取你可以简单地写一下:
// server: publish the current size of your post collection
Meteor.publish("counts-by-room", function () {
var self = this;
var count = 0;
var initializing = true;
var handle = Posts.find().observeChanges({
added: function (id) {
count++;
if (!initializing)
self.changed("counts", 'postCounts', {count: count});
},
removed: function (id) {
count--;
self.changed("counts", postCounts, {count: count});
}
});
initializing = false;
self.added("counts", 'postCounts', {count: count});
self.ready();
self.onStop(function () {
handle.stop();
});
});
// client: declare collection to hold count object
Counts = new Mongo.Collection("counts");
// client: subscribe to the count for posts
Tracker.autorun(function () {
Meteor.subscribe("postCounts");
});
// client: simply use findOne, you can get the count object
Counts.findOne()
答案 2 :(得分:4)
sub.loaded()
的想法是帮助您解决这个问题。
Posts.count()
不会返回正确的内容,因为正如您所猜测的那样,在客户端上,Meteor无法知道服务器上存在的实际帖子数量。但客户知道的是 尝试加载的帖子数量。这就是.loaded()
告诉您的内容,也就是为什么行this.fetch().length < this.loaded()
会告诉您服务器上是否有更多帖子。
答案 3 :(得分:2)
我要做的是编写一个Meteor服务器端方法来检索计数,如下所示:
Meteor.methods({
getPostsCount: function () {
return Posts.find().count();
}
});
然后在客户端上调用它,观察它是否被动反应:
function updatePostCount() {
Meteor.call('getPostsCount', function (err, count) {
Session.set('postCount', count);
});
}
Posts.find().observe({
added: updatePostCount,
removed: updatePostCount
});
答案 4 :(得分:1)
这个帖子很老了,无论如何也许它会帮助别人。 我有完全相同的问题。我设法用2条简单的线条来解决它...... 记住:
handle = Meteor.subscribeWithPagination('posts', 10);
我在客户handle.loaded()
和Posts.find().count()
中使用过。因为当它们不同时,意味着所有帖子都被加载。所以这是我的代码:
"click #nextPosts":function(event){
event.preventDefault();
handle.loadNextPage();
if(handle.loaded()!=Posts.find().count()){
$("#nextPosts").fadeOut();
}
}
答案 5 :(得分:1)
虽然这个问题很老,但我想我会提供一个最终为我工作的答案。我没有创建解决方案,我在这里找到了它的基础(因此信用到期):Discover Meteor
无论如何,在我的情况下,我试图得到&#34;尺寸&#34;客户端的数据库,所以我可以确定何时隐藏&#34;加载更多&#34; - 按钮。我正在使用模板级订阅。哦,要使此解决方案正常工作,您需要添加reactive-var -package。这是我的(简而言之):
/*on the server we define the method which returns
the number of posts in total in the database*/
if(Meteor.isServer){
Meteor.methods({
postsTotal: function() {
return PostsCollection.find().count();
}
});
}
/*In the client side we first create the reactive variable*/
if(Meteor.isClient){
Template.Posts.onCreated(function() {
var self = this;
self.totalPosts = new ReactiveVar();
});
/*then in my case, when the user clicks the load more -button,
we call the postsTotal-method and set the returned value as
the value of the totalPosts-reactive variable*/
Template.Posts.events({
'click .load-more': function (event, instance){
Meteor.call('postsTotal', function(error, result){
instance.totalPosts.set(result);
});
}
});
}
希望这有助于某人(我建议先检查链接)。对于模板级订阅,我使用它作为我的向导Discover Meteor - template level subscriptions.这是我的第一个堆叠帖子,我只是在学习Meteor,所以请怜悯...:D
答案 6 :(得分:1)
我遇到了同样的问题,并且使用publish-counts包不能使用subs-manager包。我创建了一个可以设置响应式服务器到客户端会话的程序包,并在此会话中保留文档计数。你可以在这里找到一个例子:
答案 7 :(得分:0)
我正在做这样的事情:
关于客户
Template.postCount.posts = function() {
return Posts.find();
};
然后你创建一个模板:
<template name="postCount">
{{posts.count}}
</template>
然后,无论你想要显示计数器: {{&gt; postCount}}
比我见过的任何解决方案都容易得多。