【发布时间】:2015-06-03 11:05:33
【问题描述】:
我正在使用 Meteor 1.0.5。
我想要一个从方法返回一些值的助手,但只是发现助手同步返回值但方法返回值 异步。我不知道如何处理。
例如,我需要一个帮助器来返回 ALL 帖子的计数,我编写了一个返回 'Posts.find().count()' 的方法来帮助帮助器,因为我没有不想将所有帖子发布给客户。但是,如前所述,它不起作用。
【问题讨论】:
我正在使用 Meteor 1.0.5。
我想要一个从方法返回一些值的助手,但只是发现助手同步返回值但方法返回值 异步。我不知道如何处理。
例如,我需要一个帮助器来返回 ALL 帖子的计数,我编写了一个返回 'Posts.find().count()' 的方法来帮助帮助器,因为我没有不想将所有帖子发布给客户。但是,如前所述,它不起作用。
【问题讨论】:
你可以使用闭包:
Template.myTemplate.rendered = function(){
closure.init();
};
Template.myTemplate.helpers({
foo: function(){
return closure.value();
}
});
var closure = function(){
var privateValue;
return {
init: function(){
Meteor.call(method,function(err,result){
if ( !err ) privateValue = result;
}
},
value: function(){
return privateValue;
}
}
}();
当模板被渲染时,闭包调用Meteor.call,它将结果异步存储在privateValue中。然后模板助手可以获取它。
如果该值只需要在模板中计算一次——而不是在记录列表中,这将很好用。您不应该对长列表中的每条记录执行一次服务器调用,而是希望所有这些计算作为订阅的一部分发生。
【讨论】:
我认为您应该编写一个新的 Meteor.publish 方法,其中包含您要返回的查询。
但如果您想为此使用Meteor.method,这可能是一个解决方案。
if(Meteor.isClient){
Template.example.helpers({
count:function(){
return Session.get('playersCount')
}
});
Meteor.call('playersCount',function(err,result){
if(!err){
Session.set('playersCount',result)
}
})
}
if(Meteor.isServer){
Meteor.methods({
'playersCount':function(){
return Players.find().count();
}
})
}
这是一个Meteorpad 示例
【讨论】:
Collection.find().count()上进行计数,这个更简单,服务器发布-客户端订阅和计数
不确定我是否明白你的意思.. 但你可以这样做:
Template.postsList.helpers({ posts: function() { return Posts.find(); } });
Template.postsList.helpers({ postsCount: function() { return Posts.find().count(); } });
当第一个助手返回你的“帖子”数据时,第二个只返回“计数”数字(我猜这就是你要找的,对吧?)
为了确认它正常工作,我只是简单地将 {{postsCount}} 添加到一个随机 html(如 posts_list.html)文件中,它会显示正确的帖子数。
干杯。
【讨论】: