12

我在我的应用程序中使用了流星分页订阅包。在服务器上,我的出版物如下所示:

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 包,我看到了我想做的代码:

allPostsLoaded: function(){
  allPostsLoaded = this.fetch().length < this.loaded();
  Session.set('allPostsLoaded', allPostsLoaded);
  return allPostsLoaded;  
}

但我不确定它是否真的有效。将他们的代码移植到我的代码中不起作用。

最后,Mongo 看起来确实支持我想做的事情。文档说,默认情况下, cursor.count() 会忽略限制的影响 。

似乎所有的碎片都在那里,但我很难把它们放在一起。

4

8 回答 8

7

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

这个包正是你想要的,也是反应式的。

发布次数

于 2015-01-11T05:38:08.960 回答
6

我想你可以看到演示:counts-by-room in meteor doc

它可以帮助您在服务器上发布帖子的数量并在客户端获取它

你可以简单地写这个:

// 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()
于 2015-08-21T01:05:29.053 回答
4

的想法sub.loaded()是帮助您解决这个问题。

Posts.count()不会返回正确的东西,因为正如您所猜测的,在客户端上,Meteor 无法知道服务器上存在的真实帖子数量。但是客户知道的是它尝试加载了多少帖子。这就是.loaded()告诉您的内容,这就是为什么该行this.fetch().length < this.loaded()会告诉您服务器上是否还有更多帖子。

于 2013-09-12T04:04:30.297 回答
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
});
于 2013-09-11T15:31:40.897 回答
2

尽管这个问题很老,但我想我会提供一个最终对我有用的答案。我没有创建解决方案,我在这里找到了它的基础(所以信用到期):Discover Meteor

无论如何,就我而言,我试图从客户端获取数据库的“大小”,因此我可以确定何时隐藏“加载更多”按钮。我正在使用模板级订阅。哦,要使此解决方案起作用,您需要添加 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 - 模板级订阅。这是我的第一个堆叠帖子,我正在学习 Meteor,所以请怜悯...:D

于 2015-11-06T15:48:58.360 回答
1

哎哟这篇文章很旧,无论如何也许它会对某人有所帮助。我有完全相同的问题。我设法用两条简单的线解决了它......记住:

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();
    }
}
于 2015-02-25T14:51:15.623 回答
1

我遇到了同样的问题,并且使用 publish-counts 包不适用于 subs-manager 包。我创建了一个包,它可以设置一个反应式服务器到客户端的会话,并在这个会话中保持文档计数。你可以在这里找到一个例子:

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

于 2015-11-26T11:08:22.743 回答
0

我正在做这样的事情:

在客户端

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

然后创建一个模板:

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

然后,无论你想显示计数器:{{> postCount}}

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

于 2014-07-12T02:29:38.233 回答