Meteor - Meteor.user()导致的问题未在初始页面加载时定义。我怎么能等到Meteor.user()可用/定义?

时间:2014-11-25 22:28:34

标签: meteor

在我的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()被定义,然后采取这些行动。我怎么能这样做?

2 个答案:

答案 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是可选的