流星:订阅集合子集&收集总数

时间:2015-02-20 17:30:06

标签: meteor iron-router

这是我的问题:

我订阅了一个集合的子集,用于"无限的分页"在铁路由器中(如Discover Meteor示例):

ApplicationsListController = RouteController.extend({
   template: 'applicationsList',
   increment: 10,
   limit: function(){
       return parseInt(this.params.applicationsLimit) || this.increment;
   },
   findOptions: function(){
       return {sort: {name: 1}, limit: this.limit()};
   },
   subscriptions: function(){
     this.applicationsSub = Meteor.subscribe('applications', this.findOptions()) ;
   },
   applications: function(){
     return Applications.find({}, this.findOptions());  
   },
   data: function(){
       var hasMore = this.applications().fetch().length === this.limit();
       var nextPath = this.route.path({applicationsLimit: this.limit() + this.increment});
       return {
         applications: this.applications(),
         ready: this.applicationsSub.ready,
         nextPath: hasMore ? nextPath : null
       };
   }
});

//(...)

this.route('applicationsList', {
       path: '/applications/:applicationsLimit?',
       controller: ApplicationsListController
});

我发布得很好,没问题。但是,在同一页面上,我还需要整个集合的总数(不仅是子集)。我这样发表:

Meteor.publish('applications', function(options){
   return Applications.find({}, options);
});

Meteor.publish('applicationsCount', function(){
    return Applications.find().count();
});

但有些事我想我不明白。我需要在模板中使用总计数,但我无法查看如何订阅"只是一个数字",而不创建新的集合(我不想要做)。

我已经看到了“房间数”和“房间数量”。 Meteor Doc上的例子,但它似乎远非我需要的东西(我没有空间留言,我只需要计算我的应用程序,而不是将它们全部放在客户端上)。

非常感谢,我希望我足够干净。 祝你有美好的一天。

2 个答案:

答案 0 :(得分:1)

如果你想要收集的计数。

尝试使用publish-counts package

$ meteor add tmeasday:publish-counts

所以这就是你的代码看起来应该是一样的。

 //server.js
Meteor.publish('applicationsCount', function() {
  Counts.publish(this, 'applicationsCount', Applications.find());
});

在lib文件夹上。

if(Meteor.isClient){
   Meteor.subscribe('applicationsCount')
   Counts.get('applicationsCount');
 }

现在看看Counts.get就像一个帮助器,所以你可以像这样在模板上使用它。

<span> There is a Total of {{getPublishedCount 'applicationsCount'}} Applications</span>

答案 1 :(得分:1)

感谢Ethann,我让它发挥了作用。

首先我安装了publish-counts package

$ meteor add tmeasday:publish-counts

正如Ethann所说,我在server\publications.js

上公布了这个计数
Meteor.publish('applicationsCount', function() {
  Counts.publish(this, 'applicationsCount', Applications.find());
});

我更新了我的iron-router控制器:

ApplicationsListController = RouteController.extend({
   template: 'applicationsList',
   increment: 10,

   (...)

   subscriptions: function(){
     this.applicationsSub = Meteor.subscribe('applications', this.findOptions()) ;
     this.applicationsCount = Meteor.subscribe('applicationsCount');
   },

   (...)

   data: function(){
       var hasMore = this.applications().fetch().length === this.limit();
       var nextPath = this.route.path({applicationsLimit: this.limit() + this.increment});
       Counts.get('applicationsCount');
       return {
         applications: this.applications(),
         ready: this.applicationsSub.ready,
         nextPath: hasMore ? nextPath : null
       };
   }
});

最后在我的模板中调用计数:

<span> There is a Total of {{getPublishedCount 'applicationsCount'}} Applications</span>

非常感谢。希望它会帮助这里的一些人。