我正在Firefox 39.0中的OS X 10.6.8上运行最新的Meteor(v1.1.0.3)。
我正在使用accounts-ui
和accounts-google
进行登录管理。我有一个手卷轮廓形式,其中包括“名称”字段。此字段的初始值应该是已在其个人资料中设置的名称或Google提供的名称。
我已经定义了以下模板助手:
Template.profile_edit.helpers({
my_name: (function () {var u=Meteor.user(); return u.profile.name || u.services.google.name;}())
});
我将模板中的值用作{{ my_name }}
。当我启动流星时,一切编译都很好,但是当我加载配置文件页面时,我得到以下Javascript错误:
TypeError: u is undefined
...me: (function () {var u=Meteor.user(); return u.profile.name || u.services.googl...
不是立即相关,而是为了完整性:
为什么会发生这种错误?如何解决?
答案 0 :(得分:3)
问题
这是人们在刚开始使用Meteor时遇到的常见问题。问题是当在页面加载期间执行此帮助程序时,根据从服务器发布的响应时间,当前登录用户的数据可能尚不可用。这使得它似乎是间歇性的,因为有时数据是及时发布的,而其他数据则不是。
可能的解决方案
一种可能的解决方案是安装meteorhacks:fast-render
。这将使用页面的初始html发布登录用户(由于空发布),并保证在运行此帮助程序时用户可用。当前登录用户以外的数据需要在路由器上正确设置为订阅才能使快速渲染生效。
另一个解决方案,以及在没有安装新软件包的情况下工作的解决方案是防止未定义。当没有数据时,这将有效地让助手返回undefined,但是一旦数据可用,助手将被动地重新运行并返回正确的数据。
Template.profile_edit.helpers({
my_name: function () {
var u=Meteor.user();
if(u){
return u.profile.name || u.services.google.name;
}
}
});
<强>除了强>
在你的帮助器中,我注意到你使用的是my_name:(function(){}())
之类的语法。虽然这会给你看起来像预期的结果,但问题是你立即调用这个函数并将其值赋给my_name
助手,而不是为它分配一个函数,当值改变时可以多次调用它。这打破了反应性,因此第二种解决方案不会起作用,因为它依赖于它。
Template.profile_edit.helpers({
my_name: (function () {
/*
This is immediately invoked and basically
like using my_name: "bob"
*/
}())
});