Meteor.user()。仅在页面刷新后定义的配置文件

时间:2014-08-28 23:26:12

标签: javascript meteor

我有一个名为'isActive'的帮助器和一个名为'create'的模板..见下文

Template.create.isActive = function () {
  return Meteor.user().profile.isActive;
};

当我尝试运行此代码时,它在控制台中返回以下内容:“模板助手中的异常:TypeError:无法读取未定义的属性'profile'。

我通过使用iron-router等待配置文件加载来解决这个问题:

//startup on server side:
Meteor.publish("userData", function() {
  if (this.userId) {
    return Meteor.users.find({_id: this.userId},
      {fields: {'profile.isActive': 1}});
  } else {
    this.ready();
  }
});

//startup on client side
Meteor.subscribe('userData');

//router
this.route('create', {
  path: 'create',
  waitOn : function () {
    return Meteor.subscribe('userData');
  },
  data : function () {
    return Meteor.users.findOne({_id: this.params._id});
  },
  action : function () {
    if (this.ready()) {
      this.render();
    }
  }
});

但是......它仅在我刷新页面时才有效,而不是在初始加载时。谁知道为什么会这样?并有一个修复或更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

避免错误"模板助手中的异常:TypeError:无法读取属性' profile'未定义"您需要检查Meteor.user()是否已返回对象。标准模式是:

Template.create.isActive = function () {
  var user = Meteor.user();
  return user && user.profle.isActive;
};

一旦你的助手抛出错误,反应就不会起作用,所以你需要确保处理订阅数据尚未到达的情况。

此外,等待' userData'订阅将延迟模板加载,但用户配置文件在登录时自动发布(作为空订阅)。因此,您的等待会导致任意延迟,从而增加定义Meteor.user()的可能性,但不会直接等待您需要的数据。