我有这个模板助手
Template.foo.helpers
'bar':->
console.log(Meteor.user().profile)
'baz':->
console.log(Meteor.user().profile)
'buzz':->
console.log(Meteor.user().profile)
它可以完美地记录用户对象。
但是当我尝试在模板助手之外使用它时,它会返回Uncaught TypeError: Cannot read property 'profile' of undefined
喜欢这个
checkProfile=(profile)->
console.log profile
Template.foo.helpers
'bar':checkProfile(Meteor.user().profile)
'baz':checkProfile(Meteor.user().profile)
'buzz':checkProfile(Meteor.user().profile)
我认为它在加载Meteor.user()之前执行该函数但是当我尝试在checkProfile中记录Meteor.userId
时,ex:
checkProfile=(profile)->
console.log Meteor.userId()
console.log profile
甚至
checkProfile=(profile)->
console.log Meteor.userId()
console.log(Meteor.user())
尽快记录userId,但仍然会返回未捕获的错误。
现在我得出结论,Meteor.userId()
在流星开始时始终可用,Meteor.user()
对象在之后被加载?
请告诉我这个结论,因为这些小事可能会成为我未来代码中的一个大问题。谢谢。
旁注:
我确定用户已登录,因为我在用户登录时测试错误测试。只是在页面刷新时,代码运行并在尝试运行Meteor.user()时返回该错误
答案 0 :(得分:3)
您的错误是由于尝试访问"个人资料"在未定义的对象上。因此它与checkProfile
函数无关。
模板的帮助程序包含Deps.autorun
,这意味着如果将响应数据源(如Meteor.user()
)放在帮助程序中,则每次更改反应数据源时都会重新运行帮助程序。
考虑在帮助者中使用警卫:
var user = Meteor.user();
var profile = user && user.profile;
if(profile){
checkProfile(profile);
}
上面的代码会运行几次 - 每次Meteor.user()
的数据都会更改。
了解它的工作原理: http://meteorpad.com/pad/j2bqKeMfuuLpbn2TW
创建帐户,打开控制台,然后刷新流星应用程序以查看日志。
您可以检查您是否登录:
if(Meteor.loggingIn()){
...
}
答案 1 :(得分:0)
您是否有机会在出版物中调用checkProfile?如果是这样,您需要使用publication的this.userId