我目前在完整页面刷新时数据尚未准备就绪。我收到以下错误
TypeError: Cannot read property 'earnings' of undefined
但是,当我通过另一个模板的pathFor链接转换到路径时,数据会正确加载。
我定义了以下路线:
this.route('overview', {
path: '/overview',
layoutTemplate: 'dashboardLayout',
loginRequired: 'entrySignIn',
waitOn: function() {
Meteor.subscribe('overviewData');
},
data: function() {
return {
earnings: Meteor.user().earnings,
};
},
onAfterAction: function() {
SEO.set({
title: 'Overview | ' + SEO.settings.title
});
}
});
订阅此出版物:
Meteor.publish('overviewData', function() {
if (!this.userId) { return null; }
return [
Meteor.users.find(this.userId, { fields: { earnings: 1} }),
Tabs.find({ userId: this.userId })
];
});
引用数据的模板:
<div class="period pull-left">
Period <span class='amount'>{{earnings.period}}</span>$
</div>
答案 0 :(得分:1)
在发送数据之前尝试this.ready()
,并在waitOn
功能
尝试以下代码
this.route('overview', {
path: '/overview',
layoutTemplate: 'dashboardLayout',
loginRequired: 'entrySignIn',
waitOn: function() {
return Meteor.subscribe('overviewData');
},
data: function() {
if(this.ready()){
return {
earnings: Meteor.user().earnings,
}
}
},
onAfterAction: function() {
SEO.set({
title: 'Overview | ' + SEO.settings.title
});
}
});
修改强>
这是有效的,因为this.ready()
只有在waitOn()
函数返回的订阅完成后才会成立。
在您的代码中,您发送数据时不会检查数据是否已订阅(或者数据是否已发送给客户端)。所以它返回undefined
答案 1 :(得分:0)
我认为这可能是因为浏览器需要花费一些时间来读取cookie数据以重新登录。也许尝试为您的路由添加onBeforeAction,以检查用户是否在重新路由之前登录。 / p>
this.route('overview', {
path: '/overview',
layoutTemplate: 'dashboardLayout',
loginRequired: 'entrySignIn',
waitOn: function() {
Meteor.subscribe('overviewData');
},
data: function() {
return {
earnings: Meteor.user().earnings,
};
},
onBeforeAction: function() {
if (!Meteor.user()) {
if (Meteor.loggingIn())
this.render('loadingTemplate');
}
else {
this.next();
}
},
onAfterAction: function() {
SEO.set({
title: 'Overview | ' + SEO.settings.title
});
}
});
Meteor用户是一个被动数据源,因此当loggingIn()
完成时路径应该再次运行,并且不应该抛出未定义的错误。