【问题标题】:how to return meteor call value in helper in meteor如何在流星的助手中返回流星调用值
【发布时间】:2017-01-10 11:55:09
【问题描述】:

我已将 id 从 html 传递给助手,而我的助手是 getusername

getusername(id) {
    var username = "";
    Meteor.call("getUserName", id, function(error, result) {
        if (error) {
            console.log("error", error);
        }
        if (result) {
            console.log(result);
            username = result;
        }
    });
    return username;
}

当我记录结果时,它记录了我需要的内容,但在 UI 中没有可见的用户名。 当我将它与 Reactive var 一起使用时,它变成无穷大......因为当反应变量值改变它再次执行......

【问题讨论】:

    标签: javascript meteor helper


    【解决方案1】:

    您不能从同一个助手异步获取数据并返回它,因为助手在调用完成之前返回,并且没有反应变量来指示数据在调用完成后发生了变化。使用ReactiveVar 是对的,但为了避免无限循环,您必须在模板助手之外运行Meteor.call。我建议在模板的 onCreated 钩子中执行此操作:

    Template.x.onCreated(function() {
      var self = this;
      Meteor.call("getUserName", this.data.id, function(error, result) {
        if (result) {
            self.username = new ReactiveVar(result);
        }
      });
    });
    
    Template.x.helpers({
      getUserName(id) {
        return Template.instance().username.get();
      }
    });
    

    但是请注意,在几乎所有情况下,最好直接在前端获取用户的姓名,例如 return Meteor.users.findOne(id).profile.name 或其他东西,因为这是反应性的并且更容易。

    【讨论】:

      【解决方案2】:

      由于异步行为,您不会获得返回值,您可以做的是在会话中设置返回值并从会话中获取它,无论您想要什么

      getusername(id) {
          var username = "";
          Meteor.call("getUserName", id, function(error, result) {
              if (error) {
                  console.log("error", error);
              }
              if (result) {
                  console.log(result);
                  username = result;
              }
          });
          Session.set('getUserNameResult', result);
      }
      

      【讨论】:

      • 但如果我不想使用 Session.set
      • 您可以使用反应变量查看@Waiski 的解决方案,了解有关反应存储的更多详细信息,请参阅此链接themeteorchef.com/snippets/…
      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 2015-07-16
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多