2015-12-21 33 views
0

我关注此answer on stackoverflow。在控制台中,我得到正确的总和。流星汇总结果未在模板中显示

Meteor.publish('hoursTotal', function() { 
    var self = this; 
    var pipeline = [ 
     {$group: {_id: "$userId", hours: {$sum: "$hours" }}} 
    ]; 
    var result = Reports.aggregate(pipeline); 

    _.each(result, function(result) { 
     self.added("hoursTotalSum", result._id, { 
      userId: result._id, 
      hours: result.hours 
     }); 
    }); 
    console.log(result); 
    self.ready(); 
}); 

我已经订阅了在客户端创建新的集合:

Meteor.subscribe('hoursTotalSum'); 

我的模板帮手:

Template.statsBrief.helpers({ 
    hoursTotalSum: function() { 
     var currentUserId = Meteor.userId(); 
     return Reports.find({userId: currentUserId}); 
    }, 
}); 

我的模板:

{{#each hoursTotalSum}} {{hours}} {{/each}} 

流星控制台retunrs这个:

[ { _id: 'F8ZEWeKMoRfXaEGNa', hours: 30 }, 
I20151221-09:57:09.097(0)? { _id: 'ufALZHfhWyQ8pMkgD', hours: 85 } ] 

流星模板返回此:

50 20 15 

虽然总和是正确的发生,以及后端控制台证实,我挣扎着爬值到模板中。

回答

1

我通过meteorhacks:aggregate包成功使用了聚合,但是我的做法与您的示例有点不同。我不会调试你的代码,而是展示我将如何实现相同的目标。

:下面的代码是在CoffeeScript中

写流星方法

创建一个服务器端流星方法来进行聚合。您不需要publish您的聚合,因为所有处理都发生在服务器上,并且结果由您通过$project步骤控制。

Meteor.methods 
    getHoursTotal: -> 
     return null unless @userId 
     check @userId, String 
     pipeline = [ 
      {$group:{'_id': @userId, 'hours':{$sum:'$hours'}}}, 
      {$project: 
       _id:false, 
       userId:'$_id', 
       hours: '$hours', 
      } 
     ] 
     return reports.aggregate pipeline 

在您的代码中,您正在处理结果中的每个项目。它看起来像你只是想重命名_iduserId并包括计算的hours字段。我在$project步骤中这样做了。

呼叫流星方法

你的代码依赖于userId可用,所以我们只希望它运行在用户登入之后,我们可以让这个反应使用tracker

Tracker.autorun -> 
    return unless Meteor.userId()? 
    Meteor.call 'getHoursTotal', (err, res) -> 
     Session.set 'hoursTotal', res 

现在代码会如果Meteor.userId不为空,它不运行时hoursTotal将被存储在Session准备就绪只桶。

揭露结果

要暴露的结果很好这是一个好主意,把它放在一个模板帮手。

Template.statsBrief.helpers 
    hoursTotal: -> Session.get 'hoursTotal' 

我认为以这种方式执行汇总和公开结果更简单,同时也受益于完全被动。

+0

你的解决方案工作得很好,reative等所有,但我似乎仍然无法访问模板。我能够在客户端的控制台中'Session.get('hoursTotal')',但在模板中,我正在努力 – Rexford

+0

好吧,算了一下。 'res'对象包含索引'0',因此我简单地做了'Session.set('hoursTotal',res [0]);'这种方法更具反应性和趣味性。虽然我可以用另一种方法来工作,但我认为我比这更喜欢这种方式 – Rexford