如何在客户端获取已发布集合的总计数,无论指定的限制如何?

时间:2013-09-11 14:57:57

标签: meteor

我在我的应用中使用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的影响。

好像所有的碎片都在那里,但是我把它们放在一起很麻烦。

8 个答案:

答案 0 :(得分:7)

没有一个答案可以做你真正想要的,因为没有提供反应性的解决方案。

这个包完全符合您的要求,也可以反应。

publish-counts

答案 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包。我创建了一个可以设置响应式服务器到客户端会话的程序包,并在此会话中保留文档计数。你可以在这里找到一个例子:

https://github.com/auweb/server-session/#getting-document-count-on-the-client-before-limit-is-applied

答案 7 :(得分:0)

我正在做这样的事情:

关于客户

Template.postCount.posts = function() {
    return Posts.find();
};

然后你创建一个模板:

<template name="postCount">
  {{posts.count}}
</template>

然后,无论你想要显示计数器: {{&gt; postCount}}

比我见过的任何解决方案都容易得多。