页面刷新时不会加载数据,仅在转换时加载

时间:2014-12-31 23:25:49

标签: meteor

我目前在完整页面刷新时数据尚未准备就绪。我收到以下错误

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>

2 个答案:

答案 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()完成时路径应该再次运行,并且不应该抛出未定义的错误。