Meteor客户端集合需要先填充所有数据

时间:2014-04-21 13:47:58

标签: meteor iron-router

我尝试将客户端集合用作站点配置系统。我插入代表我不同页面的文档,iron-router和导航标签都使用它们来确定它们是什么页面以及它们代表哪些模板。每个页面都使用{{> contentTemplate}}包含帮助程序来加载它的相关模板。

一切都很好,数据全部加载完毕。当我在某些网页上重新启动应用时,数据尚未加载,我收到Exception from Deps recompute function: Error: Expected null or template in return value from inclusion function, found: undefined错误。

这是我的javascript:

StoriesArray = [
{ category: 'teaching', contentTemplate: 'teachingHome', title: 'Teaching Home'},
...
];

Stories = new Meteor.Collection(null);
StoriesArray.forEach(function (story, index) {
    story._id = index + '';
    Stories.insert(story);
});

// in main.js
Template.teachingPost.contentTemplate = function() {
    console.log(this);
    console.log(this.contentTemplate);
    return Template[this.contentTemplate];
};

// in router.js
this.route('teaching', {
    layoutTemplate: 'teachingPost',
    data: function() { return Stories.findOne({contentTemplate: 'teachingHome', category: 'teaching'}); }
});

控制台在日志上方的contentTemplate帮助程序中登录两次,这是第一次:

Object {} main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:45

undefined main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:46

并且第二次如此:

Object {category: "teaching", contentTemplate: "teachingHome", title: "Teaching Home"} main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:45

teachingHome main.js?1f560c50f23d9012c6b6dd54469bb32b99aa4285:46

所以路由器只是过早地尝试加载这些数据。

我已尝试将StoriesArray加载过程放入我的应用程序的不同文件中,包括lib,甚至尝试将其放入Meteor.startup,但它已经过了iron-router。总是一样的结果。

正常的waitOn subscription / null模式在这里并不适用,因为这是一个使用{{1}}构建的客户端集合,没有服务器表示。我不希望这个有服务器代表,因为这是静态内容,不需要去我的服务器。

如何在继续之前确保此信息已完成?

1 个答案:

答案 0 :(得分:1)

未经测试,但按Iron Router's docs on waitOn

  

ready函数返回订阅句柄或任何带有waitOn方法的句柄会将句柄添加到等待列表中。

另外一般情况下,finddata而不是findOne一起使用会更好,因为find会在集合为空时返回空光标而不是findOne返回undefined。所以试试这个:

// in router.js
this.route('teaching', {
  layoutTemplate: 'teachingPost',
  data: function() {
    return Stories.find({contentTemplate: 'teachingHome', category: 'teaching'});
  },
  waitOn: function() {
    var handle = {};
    handle.ready = function() {
      if (Stories.find().count() !== 0)
        return true;
      else
        return false;
    }
    return handle;
  }
});

并调整Template.teachingPost.contentTemplate函数以使用光标而不是对象。