【问题标题】:How can a helper return a value from method in Meteor?助手如何从 Meteor 中的方法返回值?
【发布时间】:2015-06-03 11:05:33
【问题描述】:

我正在使用 Meteor 1.0.5。

我想要一个从方法返回一些值的助手,但只是发现助手同步返回值但方法返回值 异步。我不知道如何处理。

例如,我需要一个帮助器来返回 ALL 帖子的计数,我编写了一个返回 'Posts.find().count()' 的方法来帮助帮助器,因为我没有不想将所有帖子发布给客户。但是,如前所述,它不起作用。

【问题讨论】:

    标签: methods meteor helper


    【解决方案1】:

    你可以使用闭包:

    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中。然后模板助手可以获取它。

    如果该值只需要在模板中计算一次——而不是在记录列表中,这将很好用。您不应该对长列表中的每条记录执行一次服务器调用,而是希望所有这些计算作为订阅的一部分发生。

    【讨论】:

    • 谢谢。您的解决方案与@Ethaan 具有相同的精神,您的建议很重要,也许,是的,我不应该希望我的应用程序看到方法返回值。我会尝试一些其他的方法来做到这一点。
    【解决方案2】:

    我认为您应该编写一个新的 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 示例

    【讨论】:

    • 谢谢你。您将会话用作临时反应存储来保存该值,我相信它会适用于我的情况。我对您使用 Meteor.publish 方法的建议感兴趣。据我所知,Meteor 可以发布集合的子集,但它如何发布派生集合,例如,在这种情况下,集合“帖子”的数量?
    • 您只想发布一个数字?为什么不更好地使用集合进行发布,比如关注这个example,所以在服务器上发布帖子的数量,在客户端,像往常一样在助手Collection.find().count()上进行计数,这个更简单,服务器发布-客户端订阅和计数
    • 然后@Ethaan。但发布收藏对我的情况不利。在我的标题或布局中,我想显示所有某种数据的计数,但只是计数。发布少量数据的所有数据可能还不够好
    【解决方案3】:

    不确定我是否明白你的意思.. 但你可以这样做:

    Template.postsList.helpers({ posts: function() { return Posts.find(); } });
    
    Template.postsList.helpers({ postsCount: function() { return Posts.find().count(); } });
    

    当第一个助手返回你的“帖子”数据时,第二个只返回“计数”数字(我猜这就是你要找的,对吧?)

    为了确认它正常工作,我只是简单地将 {{postsCount}} 添加到一个随机 html(如 posts_list.html)文件中,它会显示正确的帖子数。

    干杯。

    【讨论】:

    • 抱歉,我想我错过了重要的一点。在我的示例中,服务器仅发布部分帖子,而不是全部,但您的代码仅返回客户端上的帖子数,而不是服务器上的帖子数(真实计数)。
    猜你喜欢
    • 2014-11-27
    • 2013-02-18
    • 2015-10-21
    • 2014-10-26
    • 2015-12-15
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多