在我的Meteor应用程序中,我有一些我想在登录时立即订阅的集合,以及我想在用户访问或重新访问初始主页时订阅的其他集合,但不是其他。
第一组集合应始终全部订阅,但第二组应在用户离开时关闭再打开并返回初始屏幕。
我有以下代码:
Meteor.startup(function () {
Meteor.subscribe('collection_one', Meteor.user().profile.setting_one);
Meteor.subscribe('collection_two', Meteor.user().profile.setting_two);
});
Router.route('/', {
name: 'home',
path: '/',
template: 'home',
waitOn: function() {
return [
Meteor.subscribe('collection_three', Meteor.user().profile.setting_three),
Meteor.subscribe('collection_four', Meteor.user().profile.setting_four),
]
}
});
我的问题是,在启动后立即进入主页,Meteor.user()会立即返回undefined。我想等到Meteor.user()被定义,然后采取这些行动。我怎么能这样做?
答案 0 :(得分:3)
Meteor.startup()不会将代码作为反应计算运行,因此即使Meteor.user()是一个反应式数据源,它也不会触发计算。
reactivity section of the docs有一个将代码作为反应计算运行的函数列表。
您可以使用Tracker(以前称为“Deps”)来创建反应式计算,如下所示:
Tracker.autorun(function () {
if (Meteor.user()) {
Meteor.subscribe('collection_one', Meteor.user().profile.setting_one);
Meteor.subscribe('collection_two', Meteor.user().profile.setting_two);
}
});
但看起来你正在使用Iron Router,所以你也可以用Router.configure设置一个全局waitOn()来解决它,如下所示:
Router.configure({
layoutTemplate: 'MasterLayout',
loadingTemplate: 'Loading',
notFoundTemplate: 'NotFound',
templateNameConverter: 'upperCamelCase',
routeControllerNameConverter: 'upperCamelCase',
// This method will re-run when ever Meteor.user() changes.
waitOn: function () {
// Making sure setting_one and setting_two are available (which they won't be initially)
var setting_one = Meteor.user() && Meteor.user().profile && Meteor.user().profile.setting_one;
var setting_two = Meteor.user() && Meteor.user().profile && Meteor.user().profile.setting_one;
// Subscribe to the published version of the server side collections
return [
Meteor.subscribe('collection_one', setting_one),
Meteor.subscribe('collection_two', setting_two)
];
}
});
答案 1 :(得分:0)
关键是使用Tracker.autorun()
import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';
let username = ''
Tracker.autorun( function(currentComputation) {
if (Meteor.user()) {
username = Meteor.user().username
if (username) // do something with username
return
}
})
currentComputation
是可选的