【问题标题】:Meteor: accessing user details on client [duplicate]Meteor:访问客户端上的用户详细信息[重复]
【发布时间】:2016-07-22 11:47:42
【问题描述】:

我正在尝试在流星的客户端访问(另一个)用户的详细信息。我有一个名为“userDetails”的服务器端方法,我从一个名为“acc”的模板助手调用它。

服务器方法:

'userDetails': function(userId) {
      check(userId, String);
      return Meteor.users.findOne({_id: userId},
                                  {fields: {
                                    "services.facebook.first_name": 1,
                                    "profile.birthday": 1,
                                    "services.facebook.gender": 1,
                                    "profile.location.name": 1
                                  }});
    }

模板助手:

acc: function(_id) {
    Meteor.call('userDetails', _id, function(err, res) {
      if(err) throw error;
      return res;
    });
  }

当我尝试在模板中访问 acc.profile.birthday 时,我什么也没得到。这是什么原因造成的?

【问题讨论】:

  • 你不能访问这样的模板助手。您必须在模板本身中使用 acc 才能看到输出。
  • 嗨@BlazeSahlzen,你是说我不能在模板中使用 {{acc.profile.birthday}} 吗?因为这就是我正在做的......
  • 哦,对不起,我误会了。是的,你可以这样做。您可以在返回之前尝试安慰 res 对象,以确定该对象具有什么结构。

标签: meteor meteor-blaze meteor-accounts


【解决方案1】:

您必须将 return 包装在 else 语句中。

if(error) {

}
else {
   return res;
}

异步调用你的方法。这意味着回调函数将在您的服务器方法完成时执行。

如果你想在模板上显示结果,你有两种可能:

1/ 使用会话。

acc: function(_id) {
  Meteor.call('userDetails', _id, function(err, res) {
    if(err){
    }else{
      Session.set('data', res)
    }

  });
  return Session.get('data')
}

2/ 使用模板订阅(更好的解决方案): 在服务器上,您发布数据:

Meteor.publish("data", function(){
     return Meteor.users.findOne(...)
});

在客户端,您订阅:

Template.mytemplate.onCreated(function () {   
    Template.instance().subscribe("data");
});

然后您可以直接在客户端上创建一个助手并调用 findOne。

在html中:

  {{#if Template.subscriptionsReady}}
    {{#each myHelper}}
       {{acc.profile.birthday}}
    {{/each}}
  {{else}}
    <p>Loading...</p>
  {{/if}}

关于用户的重要通知: 默认情况下,用户配置文件是可编辑的。请阅读:https://dweldon.silvrback.com/common-mistakes

【讨论】:

  • 感谢@hlx,这是一个很好且全面的答案,但是我不确定我是否会有第二个助手来返回会话。
  • @L4zl0w 我更新了答案,因此您不需要第二个助手。请标记答案,以免问题不再显示为未回答
【解决方案2】:

Meteor 调用是异步调用,这就是你的助手不返回任何数据的原因。

这里的最佳选择是使用SessionReactiveVarReactiveDict

我将在这里使用Session 选项

acc: function(_id) {
  Meteor.call('userDetails', _id, function(err, res) {
    if(err){

    }else{
      Session.set('userDetails', res)
    }

  });
  return Session.get('userDetails')
}

在您的 html 中,您可以像这样使用这个助手

{{#if acc}}
  {{name}}
  ...
{{else}}
  <p>Information not found</p>
{{/if}}

【讨论】:

  • return 语句不应该在方法调用之外吗?
  • 谢谢,我设法让它使用这种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2017-10-02
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多