首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示Meteor的头像

显示Meteor的头像
EN

Stack Overflow用户
提问于 2015-08-25 00:44:58
回答 2查看 754关注 0票数 2

我想为用户显示一张头像。我有一个默认的照片,是保存时,用户第一次获得一个帐户。

代码语言:javascript
复制
Accounts.createUser({
      email: email,
      username: username,
      password: password,
      profile: {
        profilePhotoUrl: "..."
      }
}

我想在导航栏上显示这张照片:

代码语言:javascript
复制
<img src="{{c.url profile.profilePhotoUrl format=format}}">

这张照片似乎有时会显示,而不是其他。我相信这是订阅的问题。

代码语言:javascript
复制
Exception from Tracker recompute function:
meteor.js:888 TypeError: Cannot read property 'match' of undefined
    at cloudinary_url (lepozepo_cloudinary.js:338)
    at Object.$.cloudinary.url (lepozepo_cloudinary.js:432)
    at Object.Cloudinary._helpers.url (lepozepo_cloudinary.js:799)
    at spacebars.js:245
    at Spacebars.call (spacebars.js:172)
    at Spacebars.mustacheImpl (spacebars.js:109)
    at Object.Spacebars.mustache (spacebars.js:113)
    at HTML.DIV.HTML.BUTTON.HTML.IMG.src (template.header.js:57)
    at Object.Blaze._withCurrentView (blaze.js:2197)
    at Blaze._HTMLJSExpander.def.visitAttribute (blaze.js:2125)

我不确定这是什么意思,但我认为它正在接收null,因为我还没有订阅profile.profilePhotoUrl。我怎样才能使它对整个站点可用呢?我也想展示其他人的头像,那么如何才能做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2015-08-25 00:53:20

之所以会发生这种情况,是因为在从服务器加载当前用户数据之前,profile.profilePhotoUrl是未定义的。这里的问题是,除非收到有效的string,否则你的c.url帮助器会变得疯狂,这是不幸的。

有几种方法可以离开这里,其中之一是创建另一个帮助器

代码语言:javascript
复制
var defaultId = "..."; // make sure this is a valid public id

Template.registerHelper('getProfilePhoto', function () {
  return (this.profile && this.profile.profilePhoto) || defaultId;
});

这将确保您的"profilePhoto“不仅是一个字符串,而且是一个有效的id。现在,将模板代码替换为

代码语言:javascript
复制
<img src="{{c.url getProfilePhoto format=format}}">

应该可以解决您所描述的问题。

如果没有defaultId的自然选择,您可以在没有提供profilePhoto的情况下使用自定义url,因此

代码语言:javascript
复制
{{#if profile.profilePhoto}}
  <img src="{{c.url profile.profilePhotoUrl format=format}}">
{{else}}
  <img src="/a/path/for/default/avatar.png">
{{/if}}

你也可以使用一些加载指示器来代替默认图像。

编辑

如果您在应用程序中使用某种类型的路由,例如iron:router,那么也可以等到用户数据到达时再呈现模板,因此

代码语言:javascript
复制
Router.route('/user/profile/page', {
  // ...
  waitOn: function () {
    return {
      ready: function () {
        return !!Meteor.user();
      }
    };
  },
});

但是,我不建议这样做,因为这会影响网站的“加载”时间,因此也会影响用户体验。

票数 1
EN

Stack Overflow用户

发布于 2015-08-25 15:44:52

默认情况下,并不是发布用户的所有属性。您必须通过将它们添加到UserData发布来显式地添加它们。

你可以在这个答案中找到一个例子:Meteor User Property

此外,根据您定义传送路线的方式,您需要重新订阅userData发布以使数据可用,或者您可以将订阅放在显示图片的模板中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32187497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档