模板助手中的异常:TypeError:无法读取属性' profile'未定义的

时间:2014-09-10 06:13:59

标签: javascript meteor

在我收到此错误之前,我遇到了类似的问题:

  

模板助手中的异常:TypeError:无法读取属性   'profile'未定义

同样的事情再次发生,但是在第二个订单上,其中包含另一个用户配置文件信息(定义了第一个配置文件)。 如何让它在{{#each orders}}中重新呈现?

当只有2个订单时,由于某种原因,info.firstName,lastName和building也会被调用3次...

在HTML中:

<template name="orderItem">
  <section>
    <form role="form" id="ordersList">
      <div>
        {{#each orders}}
          <input type="text" name="name" value="{{info.firstName}} {{info.lastName}}">
        {{/each}}
      </div>
      <div>
        {{#each orders}}
          <input type="text" name="building" value={{info.building}}>
        {{/each}}
      </div>
      <div>
        {{#each orders}}
          <input type="text" name="featuredDish" value={{featuredDish}}>
        {{/each}}
      </div>
    </form>
  </section>
</template>

在javascript中:

Template.orderItem.orders = function() {
  var todaysDate = new Date();
  return Orders.find({dateOrdered: {"$gte": todaysDate}});
};

Template.orderItem.info = function() {
  var userId = this.userId;
  var user = Meteor.users.findOne(userId)
  var firstName = user.profile.firstName;
  var lastName = user.profile.lastName;
  var building = user.profile.building;

  return {
    firstName: firstName,
    lastName: lastName,
    building: building
  }
};

感谢帮助!

1 个答案:

答案 0 :(得分:15)

此错误是常见问题。 您正在尝试访问未定义的用户对象。 函数info不会检查user是否是正确的对象。使用名为guarding的技术:

Template.orderItem.info = function() {
  var userId = this.userId;
  var user = Meteor.users.findOne(userId)

  var firstName = user && user.profile && user.profile.firstName;
  var lastName = user && user.profile  && user.profile.lastName;
  var building = user && user.profile  && user.profile.building;

  return {
    firstName: firstName,
    lastName: lastName,
    building: building
  }
};

即使用户是undefined,上面的代码也不会抛出任何错误。

我假设您已删除autopublish个包裹。 可能您还没有发布/订阅Meteor.users集合,因此没有数据可以在minimongo中找到。

请记住发布Meteor.users集合并订阅它:

Meteor.publish("users", function(){
  return Meteor.users.find({},{fields:{profile:1}})
})

Meteor.subscribe("users");

Publish certain information for Meteor.users and more information for Meteor.user