流星汇总结果未在模板中显示
问题描述:
我关注此answer on *。在控制台中,我得到正确的总和。流星汇总结果未在模板中显示
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
虽然总和是正确的发生,以及后端控制台证实,我挣扎着爬值到模板中。
答
我通过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
在您的代码中,您正在处理结果中的每个项目。它看起来像你只是想重命名_id
到userId
并包括计算的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'
我认为以这种方式执行汇总和公开结果更简单,同时也受益于完全被动。
你的解决方案工作得很好,reative等所有,但我似乎仍然无法访问模板。我能够在客户端的控制台中'Session.get('hoursTotal')',但在模板中,我正在努力 – Rexford
好吧,算了一下。 'res'对象包含索引'0',因此我简单地做了'Session.set('hoursTotal',res [0]);'这种方法更具反应性和趣味性。虽然我可以用另一种方法来工作,但我认为我比这更喜欢这种方式 – Rexford